Тайм-аут запросов PHP POST

#php #file-upload #timeout #http-post #request-timed-out

#php #загрузка файла #тайм-аут #http-post #время ожидания запроса истекло

Вопрос:

В настоящее время я работаю над скриптом загрузки, поддерживающим большие загрузки (~ 50 Мб), и я очень быстро столкнулся с проблемой! Я использую традиционный POST-запрос с формой, загружающей файл во временное местоположение, а затем перемещающей его с помощью PHP. Естественно, я обновил свой файл php.ini для поддержки файлов размером чуть больше, чем по умолчанию, и файлы размером около 15 Мб загружаются очень хорошо!

Основная проблема связана с моей хостинговой компанией. Они разрешают сценариям тайм-аут через 60 секунд, что означает, что POST-запросы, выполнение которых занимает более 60 секунд, умрут до того, как временный файл достигнет PHP-скрипта, и это, естественно, приводит к внутренней ошибке сервера.

Невозможность установить тайм-аут на сервере (после жарких дебатов) Я рассматриваю варианты. Есть ли способ выполнить запрос или как-то обновить его, чтобы уведомить сервер и сбросить время? Или существуют альтернативные методы загрузки, которые не требуют тайм-аута?

Комментарии:

1. Я не знал, что отправка POST была синхронизирована и является частью тайм-аута скрипта, я никогда не сталкивался с этой проблемой, и у меня были загрузки, превышающие 300 МБ (частные приложения).

2. В PHP любые настройки, связанные с загрузкой, ДОЛЖНЫ выполняться через настройки уровня php.ini (или переопределения в httpd.conf/.htaccess). Они не могут быть изменены с помощью ini_set, так как загрузка должна завершиться ДО того, как PHP начнет выполнять ваш код для достижения этих настроек. Вам ничего не нужно делать, кроме как разбивать ваши загрузки на фрагменты с помощью загрузчика на основе flash / java на стороне клиента.

Ответ №1:

Есть несколько вещей, которые вы могли бы рассмотреть. Каждый из них имеет свою стоимость, и вам нужно будет определить, какой из них наименее затратный.

  1. Найдите новую хостинговую компанию. Это может быть вашим лучшим решением.

  2. Создайте довольно сложную клиентскую систему, которая разбивает загрузку на несколько блоков и отправляет их через AJAX. Это некрасиво, особенно потому, что это полезно только для обхода правила хоста.

Я бы действительно исследовал # 1.

Комментарии:

1. Я думаю, это то, что вы получаете за выбор дешевого хостингового решения: P Спасибо за супер быстрые ответы 🙂

Ответ №2:

С большим трудом. Безусловно, ваш самый простой вариант — сбросить жесткий хост и выбрать тот, который действительно позволяет вам быть продуктивным. Я лично использую TSOHost — работаю с ними уже более полутора лет, и до сих пор у меня не было абсолютно никаких причин жаловаться (даже небольшого раздражения).

Ответ №3:

Вы действительно уверены, что это проблема с таймаутом? Моя первая идея…

  • передача не удалась из-за ограничения конфигурации, установленного в файле php.ini веб-сервера. Вам нужно изменить его или установить в качестве локальных настроек в вашем скрипте

    # найдите его в php.ini, используемом вашей конфигурацией memory_limit = 96M post_max_size = 64M upload_max_filesize = 64M

Или непосредственно в вашем скрипте

 ini_set('memory_limit', '96M'); 
ini_set('post_max_size', '64M'); 
ini_set('upload_max_filesize', '64M');