Я изучаю, что является лучшим значением для установки значений по умолчанию в PHP. Я видел много противоречащих вопросов о max_input_time
.
В этом ответе говорится, что он считает, что загрузка файлов не учитывается в отношении таймеров: https://stackoverflow.com/a/3758522/518169
Хотя в официальной документации PHP есть огромное красное предупреждение:
max_input_time устанавливает максимальное время, в секундах, скрипту разрешено получать ввод; это включает в себя загрузку файлов. Для больших или нескольких файлов или пользователей с более медленными соединениями может быть превышено значение по умолчанию 60 секунд
Источник: http://php.net/manual/en/features.file-upload.common-pitfalls.php , последнее обновление: пт, 06 июл 2012
Поэтому из-за этого max_input_time
влияет на загрузку файлов, и, чтобы быть уверенным, что посетители могут загружать, скажем, 20 МБ файлов даже из медленных или мобильных подключений, значение по умолчанию 60 определенно недостаточно!
Что вы рекомендуете устанавливать для этого значения? 300?
Кроме того, существует ли какая-либо связь между max_execution_time
и max_input_time
? Например, max_execution_time
должен быть больше, чем max_input_time
?
После некоторого быстрого бенчмаркинга я не верю, что max_input_time
имеет отношение к обработке больших загрузок пользователями с медленными соединениями.
С http://us3.php.net/manual/en/info.configuration.php#ini.max-input-time
Это устанавливает максимальное время в секундах, когда скрипту разрешено анализировать входные данные, такие как POST и GET. Он измеряется с момента получения всех данных на сервере до начала выполнения скрипта.
Я использую PHP 5.3.8 и использовал следующую конфигурацию .htaccess
php_value max_input_time 5 php_value max_execution_time 1 php_value upload_max_filesize "2048M" php_value post_max_size "2048M"
Мой тестовый скрипт:
<?php if (!empty($_FILES)) { echo '<pre>'; var_dump($_FILES); echo '</pre>'; } ?> <form enctype="multipart/form-data" method="POST"> File: <input name="userfile" type="file" /> <input type="submit" value="Upload" /> </form>
С несколькими испытаниями мой 1.5G-файл занимает около 16-17 секунд для загрузки , 4-5 секунд для обработки , а время выполнения – это, по существу, 0.
С max_input_time 5
скрипт завершается. С его значением 4 мы получаем PHP Fatal error: Maximum execution time of 4 seconds exceeded in Unknown on line 0, referer: http://localhost/test-upload.php
Также кажется, что max_execution_time
имеет никакого отношения, поскольку мы сохраняли его на уровне 1 во время тестов.
Я подробно изучил max_input_time . Время передачи по сети не является фактором. PHP как обработчик Apache (mod_php) или Nginx / PHP-FPM -pair дал аналогичные результаты: PHP получает загруженный файл после завершения передачи, а веб-сервер передает данные. На моих тестах 2 секунды max_input_time было достаточно для обработки 800-мегабайтной загрузки.
Все подробности находятся на странице http://blog.hqcodeshop.fi/archives/185-PHP-large-file-uploads.html.
Это будет зависеть от того, как PHP подключается к веб-серверу.
Технически веб-сервер может вызывать PHP, как только он имеет заголовки запросов – в этом случае PHP будет сжиматься, это большие пальцы, ожидающие, когда данные POST попадут в Интернет, пока не смогут заполнить переменные запроса (это вполне возможно что max_input_time будет превышено). Но чаще всего веб-сервер задерживает вызов PHP до тех пор, пока не получит полный запрос (намного меньше вероятность того, что max_input_time будет превышено).
Начиная с PHP 5.4, загрузка файлов PHP может определенно влиять на max_input_time. Я недавно получал 500 ошибок в файлах, для загрузки которых потребовалось больше 60 секунд. Я изменил это единственное значение в моем php.ini, и он ушел.
Кроме того, формулировка в руководстве отличается от того, что указано в принятом ответе. Теперь он говорит:
Это устанавливает максимальное время в секундах, когда скрипту разрешено анализировать входные данные, такие как POST и GET. Сроки начинаются в тот момент, когда PHP вызывается на сервере и заканчивается, когда начинается выполнение.
Я использовал PHP 5.4.16 nts и IIS 7.5. По-видимому, PHP вызывается перед загрузкой файла.
Интересно отметить, что мои журналы ошибок PHP дали неверную ошибку. Они заявили, что «PHP Fatal error: максимальное время выполнения 10000 секунд превышено в …». Не имело значения, для чего я установил max_execution_time, это даст ту же ошибку с новым номером.