#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:
Есть несколько вещей, которые вы могли бы рассмотреть. Каждый из них имеет свою стоимость, и вам нужно будет определить, какой из них наименее затратный.
-
Найдите новую хостинговую компанию. Это может быть вашим лучшим решением.
-
Создайте довольно сложную клиентскую систему, которая разбивает загрузку на несколько блоков и отправляет их через 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');