Почему PHP хранит загруженные файлы во временном месте и в чем преимущество?
хорошо, я совершенно новичок в этой области и просматриваю некоторые учебники, и я обнаружил, что при загрузке файлов в PHP он хранит их во временном месте.
$file_temp=$_FILES['file']['tmp_name'];
$file_loc="Upload".$file_name;
move_uploaded_files($file_temp,$file_loc);
теперь почему PHP не позволяет загружать файлы непосредственно в нужное место? Почему они хранятся во временном месте с собой .расширение tmp и какую выгоду мы получаем от этой стратегии?
3 ответов:
хороший вопрос. Короткий ответ заключается в том, что PHP должен обрабатывать весь HTTP запрос-заполнение
$_POSTс данными, а$_FILESпо мере необходимости-перед предоставлением контроля над вашим скриптом. Так как ваш скрипт не получает контроль до после обработка, нет никакого способа сказать PHP, куда поместить эти данные файла.но почему PHP делает это таким образом? Ну, давайте посмотрим на HTTP POST с данными файла:
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 может дать вам все the
$_POSTданные, PHP должен обработать весь запрос. Так что это может также завершить$_FILESсупер-глобальный, пока он есть.теперь PHP может сохранить этот файл данных в памяти, но это может быть действительно плохая идея. Подумайте о том, что произойдет, если PHP потребуется для хранения файла 100 MiB, загруженного пользователем. Внезапно у вас есть увеличение 100 MiB в RSS вашего процесса Apache, что действительно не слишком хорошо-Apache может быть
ulimited, чтобы не иметь столько места, или Apache может быть заменен: для ваших пользователей мучения. Так, в PHP не лучший вариант: поставить этот получил файл во временном файле.вы можете спросить, почему PHP не может сказать, какой файл сначала поместить данные входящего файла, поэтому вам не нужно было его перемещать. Ну, это проблема начальной загрузки: PHP еще не передал управление скрипту, поэтому скрипт не может сказать PHP, куда поместить файл. Таким образом, PHP делает все возможное: помещает данные файла во временный файл.
теперь вы можете хранить данные этого файла на диске RAM, для скорости, если хотите. Это хороший подход, если вы не обратите внимание на стоимость инфраструктуры (например, поддержание установки RAM-диска). Но обратите внимание, что это не похоже на PHP, удерживающий его в самой ОЗУ: в этом сценарии процесс контейнера PHP (обычно Apache или какой-либо другой веб-сервер) должен иметь кучу для хранения файла (чего может и не быть). В этом случае RAM-диск управляется ядром.
- на большинстве платформ перемещения файлов являются атомарными, но записи файлов-нет (особенно если вы не можете записать все данные за один раз). Поэтому, если у вас есть типичный шаблон производителя / потребителя (один процесс создает файлы, другой наблюдает за каталогом и подбирает все, что он находит), сначала записывает во временную папку и только затем переходит к реальное расположение означает, что потребитель никогда не сможет увидеть незаконченный файл.
- если процесс, который записывает файл умирает на полпути через, у вас есть сломанный файл на диске. Если он находится в реальном месте, вы должны позаботиться о его очистке самостоятельно, но если он находится в временном месте, ОС позаботится об этом. Если файл создается во время выполнения задания резервного копирования, задание может получить неполный файл; временные каталоги обычно исключаются из резервных копий, поэтому файл будет включаются только после перемещения в конечный пункт назначения.
- каталог temp может находиться в быстрой, но изменчивой файловой системе (например, ramdisk), что может быть полезно для таких вещей, как загрузка нескольких фрагментов одного и того же файла параллельно или выполнение обработки на месте в файле с большим количеством запросов. Кроме того, временные каталоги, как правило, вызывают большую фрагментацию, чем каталоги с менее частыми чтениями, записями и удалениями, и сохранение временного каталога в отдельном разделе может помочь сохранить фрагментация других разделов вниз.
две дополнительные причины:
Если вы решили не принимать файл по какой-то причине, он хранится во временной папке, и, вероятно, будет автоматически удален в какой-то момент.
безопасность. Предположим, PHP был настроен на загрузку в веб-доступный каталог, например /images. Кто-то может загрузить какой-то хакерский файл, а затем выполнить его. Сначала поместите файлы во временный каталог (который обычно не будет доступен в интернете), PHP позволяет сначала изучить файл. Например, путем обработки изображений для удаления любых комментариев, которые могут содержать PHP-код.
Comments