Правильный ответ в IT-тесте

На днях проходил тест по языку PHP на одном известном русскоязычном ресурсе. Многие вопросы были понятны, а ответы на них — очевидны. Но были и такие, которые заставляли задуматься, найти ответ, а потом… снова задуматься. Об одном из таких вопросов я и хочу рассказать.

Где находится файл загружаемый на сервер при помощи PHP скрипта.

  • Файл находится в оперативной памяти.
  • Файл хранится во временной директории и удаляется после выполнения скрипта.
  • PHP не может загружать файлы на сервере
  • Файл хранится в корне сайта и удаляется после выполнения скрипта.

орфография и пунктуация сохранены, возможен выбор только 1 варианта ответа

Что мы знаем о загрузке файлов PHP скриптом?
  1. PHP может загружать файлы;
  2. PHP может удалять файлы;
  3. методом POST файлы загружаются во временную папку;
  4. временную папку возможно сменить на другую;
  5. по окончанию работы скрипта загруженные файлы удаляются из временной папки автоматически;
  6. методом PUT загрузкой файлов управляет скрипт, который может сохранять их в любом месте;
  7. во время загрузки файл, очевидно, некоторое время находится в оперативной памяти и клиента и сервера.


Для начала мы исключаем заведомо ложный вариант: «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
Метки:
php, тесты