Почему PHP хранит загруженные файлы во временном расположении и в чем его преимущество?


Хорошо, я совершенно новичок в этой области и просматриваю некоторые учебные пособия, и я обнаружил, что при загрузке файлов в PHP они сохраняются во временном расположении.

$file_temp=$_FILES['file']['tmp_name'];
$file_loc="Upload".$file_name;
move_uploaded_files($file_temp,$file_loc);

Теперь, почему PHP не позволяет загружать файлы непосредственно в нужное место? Почему они хранятся во временном расположении с расширением .tmp и какую выгоду мы получаем от этой стратегии?

Author: psmears, 2018-02-16

3 answers

Хороший вопрос. Короткий ответ заключается в том, что PHP должен обработать весь HTTP-запрос - заполнить $_POST данными и $_FILES по мере необходимости - прежде чем передавать управление вашему скрипту. Поскольку ваш скрипт не получает контроль до после обработки, нет способа указать PHP, куда поместить данные этого файла.

Но почему PHP делает это таким образом? Что ж, давайте посмотрим на HTTP-СООБЩЕНИЕ с данными файла:

POST /upload?upload_progress_id=12344 HTTP/1.1
Host: localhost:3000
Content-Length: 1325
Origin: http://localhost:3000
... other headers ...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryePkpFF7tjBAqx29L

------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="MAX_FILE_SIZE"

100000
------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="uploadedfile"; filename="hello.o"
Content-Type: application/x-object

... contents of file goes here ...
------WebKitFormBoundaryePkpFF7tjBAqx29L--

Обратите внимание, что содержание запроса является документ с кодировкой из нескольких частей, с полями формы, перемежающимися данными файла. В этом конкретном примере поле формы встречается перед данными файла. Однако возможно - действительно вероятно - что данные формы появляются после данных файла.

Итак, чтобы гарантировать , что PHP может предоставить вам все данные $_POST, PHP должен обработать весь запрос. Так что с таким же успехом он мог бы завершить $_FILES суперглобальный, пока он там.

Теперь PHP может сохранить эти данные хранятся в памяти, но это может быть действительно плохой идеей. Подумайте о том, что произойдет, если PHP потребуется для хранения файла размером 100 МБ, загруженного пользователем. Внезапно у вас появилось увеличение RSS вашего процесса Apache на 100 Мбайт, что на самом деле не слишком хорошо - Apache может быть ulimitотредактирован, чтобы не занимать так много места, или Apache может быть заменен: к вашим страданиям пользователей. Итак, PHP делает следующее лучшее: помещает этот полученный файл во временный файл.

Вы можете спросить, почему PHP нельзя указать, какой файл сначала поместите данные входящего файла, чтобы вам не пришлось его перемещать. Ну, это проблема начальной загрузки: PHP еще не передал управление сценарию, поэтому сценарий не может указать PHP, куда поместить файл. Таким образом, PHP делает все возможное: помещает данные файла во временный файл.

Теперь вы можете сохранить данные этого файла на диске оперативной памяти, для ускорения, если хотите. Это хороший подход, если вы не возражаете против затрат на инфраструктуру (например, поддержание настройки RAM-диска). Но обратите внимание, что это не похоже на PHP хранение его в самой оперативной памяти: в этом сценарии процесс контейнера PHP (обычно Apache или какой-либо другой веб-сервер) должен иметь кучу для хранения файла (чего может и не быть). В этом сценарии оперативная память управляется ядром.

 76
Author: bishop, 2018-07-28 19:59:26

Из В чем преимущество записи во временное местоположение, а затем копирования его в предполагаемое место назначения?:

  • На большинстве платформ перемещение файлов является атомарным, а запись файлов - нет (особенно если вы не можете записать все данные за один раз). Поэтому, если у вас типичный шаблон производителя/потребителя (один процесс создает файлы, другой просматривает каталог и собирает все, что находит), сначала записывайте во временную папку и только затем перемещайтесь в реальное местоположение означает, что потребитель никогда не сможет увидеть незаконченный файл.
  • Если процесс, записывающий файл, останавливается на полпути, у вас на диске поврежден файл. Если он находится в реальном месте, вы должны позаботиться о его очистке самостоятельно, но если он находится во временном месте, ОС позаботится об этом. Если файл создается во время выполнения задания резервного копирования, задание может получить неполный файл; временные каталоги обычно исключаются из резервных копий, поэтому файл будет включен только один раз переехал в конечный пункт назначения.
  • Временный каталог может находиться в быстрой, но изменчивой файловой системе (например, на диске оперативной памяти), что может быть полезно для таких вещей, как параллельная загрузка нескольких фрагментов одного и того же файла или обработка файла на месте с большим количеством запросов. Кроме того, временные каталоги, как правило, вызывают большую фрагментацию, чем каталоги с менее частыми операциями чтения, записи и удаления, и сохранение временного каталога в отдельном разделе может помочь сохранить фрагментацию другого перегородки опущены.
 18
Author: Jomoos, 2018-02-16 03:30:58

Две дополнительные причины:

  1. Если вы по какой-либо причине решите не принимать файл, он будет сохранен во временном расположении и, предположительно, в какой-то момент будет автоматически удален.

  2. Безопасность. Допустим, PHP был настроен для загрузки в веб-доступный каталог, например /images. Кто-то мог загрузить какой-то хакерский файл, а затем выполнить его. Помещая файлы сначала во временный каталог (который обычно не будет доступен через Интернет), PHP позволяет вам изучить сначала файл. Например, путем обработки изображений для удаления любых комментариев, которые могут содержать PHP-код.

 4
Author: 24Ahead, 2018-02-16 18:47:21