На днях проходил тест по языку PHP на одном известном русскоязычном ресурсе. Многие вопросы были понятны, а ответы на них — очевидны. Но были и такие, которые заставляли задуматься, найти ответ, а потом… снова задуматься. Об одном из таких вопросов я и хочу рассказать.
Где находится файл загружаемый на сервер при помощи PHP скрипта.
- Файл находится в оперативной памяти.
- Файл хранится во временной директории и удаляется после выполнения скрипта.
- PHP не может загружать файлы на сервере
- Файл хранится в корне сайта и удаляется после выполнения скрипта.
орфография и пунктуация сохранены, возможен выбор только 1 варианта ответа
- PHP может загружать файлы;
- PHP может удалять файлы;
- методом POST файлы загружаются во временную папку;
- временную папку возможно сменить на другую;
- по окончанию работы скрипта загруженные файлы удаляются из временной папки автоматически;
- методом PUT загрузкой файлов управляет скрипт, который может сохранять их в любом месте;
- во время загрузки файл, очевидно, некоторое время находится в оперативной памяти и клиента и сервера.
Для начала мы исключаем заведомо ложный вариант: «PHP не может загружать файлы на сервере».
«Файл находится в оперативной памяти.»
Возможен ли вариант, когда загружаемый файл попадет на сервер минуя ОЗУ? Адекватных возможностей реализовать это я не нашел.
Вывод: ответ имеет смысл и истинен.
«Файл хранится во временной директории и удаляется после выполнения скрипта.»
Если отправитель использовал метод POST (стандартная ситуация), то PHP позаботится о том, чтобы файл сохранился в папке для временных файлов. Скрипт должен переместить этот в файл либо удалить его самостоятельно, но, даже если этого не произойдет, файл будет автоматически удален из папки для временных файлов по завершению работы скрипта.
Вывод: ответ имеет смысл и истинен.
«Файл хранится в корне сайта и удаляется после выполнения скрипта.»
Сохранять файлы в корне сайта, особенно когда они приходят извне, а не создаются самим скриптом — крайне сомнительная практика. Однако, если у нас есть права на запись в корень нашего сайта, мы можем свободно сохранять туда файлы, полученные методом PUT.
Также возможно установить директиву upload_tmp_dir, указав в качестве значения путь к корню сайта, что позволит загружать файлы методом POST прямо в корень сайта.
Также ничто (кроме здравого смысла) не запрещает содержать сам сайт во временной папке или устанавливать пусть к системной временной папке равным пути к корню сайта.
По окончанию работы скрипта файлы могут быть удалены скриптом или автоматически.
Вывод: смысл ответа сомнительный, но технически легко реализуемый.
Финишная прямая
Исключаем последний вариант с неадекватно настроенным сервером. У нас остается 2 правильных ответа, но один из них — ответ на вопрос теста, а второй — ответ на какой-то другой вопрос.
Анализируем сам вопрос
«Где находится файл загружаемый на сервер при помощи PHP скрипта.»
Видим, что в конце предложения стоит точка, а не знак вопроса. Значит это — утверждение или опечатка. Замечаем, что после слова «файл» отсутствует запятая. Опечатка?
«Где находится файл»
Файл может находится как в оперативной памяти, так и в папке.
«файл загружаемый на сервер»
Файл, загружаемый на сервер, очевидно, находится на стороне отправителя. Мы не знаем точно его расположения, но уверены, что он побывает в оперативной памяти в процессе загрузки. Файл, уже загруженный на сервер, очевидно, находится на сервере, однако вопрос — о файле загружаемом, т.е. о файле-источнике.
«загружаемый на сервер при помощи PHP скрипта»
С помощью скрипта файлы загружается методом PUT (метод POST загружает файл автоматически). Скрипт не обязан записывать содержимое файла из потока ввода в физический файл на сервере. Также скрипт может самостоятельно инициировать загрузку файла из удаленного источника при помощи функции fopen() и обработать его в оперативной памяти, не сохраняя на сервере.
Итог
Несмотря на то, что ответ «Файл хранится во временной директории и удаляется после выполнения скрипта.» дает верную информацию о работе PHP с загружаемыми файлами, по моему мнению, непосредственно на заданный в тесте вопрос отвечает фраза «Файл находится в оперативной памяти.». Я выбираю именно этот вариант.
P.S. Наличие орфографических ошибок в тексте вопроса оставляет тревожное ощущение, что выбранный мной вариант ответа может оказаться неверным по мнению автора теста, т.к. я мог понять вопрос неправильно.
Используемые источники информации:
php.net/manual/ru/features.file-upload.post-method.php
php.net/manual/ru/features.file-upload.put-method.php
php.net/manual/ru/function.unlink.php
php.net/manual/en/function.fopen.php
Автор: бро