Может ли время загрузки файла в PHP? - PullRequest
34 голосов
/ 23 февраля 2009

Привет, я новичок в PHP, я создал форму для очень больших файлов CSV, которые будут загружены на мой сервер. Кто-то упомянул мне, что браузер может отключиться из-за большого размера загружаемого файла, это правда? и если да, то можно ли это предотвратить?

Спасибо за вашу помощь!

Ответы [ 11 ]

56 голосов
/ 23 февраля 2009

Вам нужно правильное значение для следующих настроек php.ini:

  1. max_input_time ( not max_execution_time!)
  2. upload_max_filesize
  3. post_max_size

и, возможно,

  1. memory_limit
30 голосов
/ 23 февраля 2009

Существуют некоторые директивы конфигурации, которые могут вызвать сбой при большой загрузке, если их значения слишком малы:

PHP

  • max_input_time Максимальное время в секундах, в течение которого скрипту разрешается анализировать входные данные, такие как POST, GET и загрузка файлов
  • upload_max_filesize Максимальный размер загружаемого файла.
  • post_max_size Максимально допустимый размер почтовых данных.

Apache

  • TimeOut Время, в течение которого сервер будет ожидать определенных событий, прежде чем выполнить запрос
  • LimitRequestBody Ограничивает общий размер тела HTTP-запроса, отправленного клиентом

Возможно, есть еще кое-что.

5 голосов
/ 23 февраля 2009

Хороший способ обойти плохую обработку больших файловых загрузок в php - это использовать загрузчик, такой как JUpload , который перед отправкой разбивает файл на куски. Это также дает вашим пользователям преимущество в том, что они получают правильную обратную связь при загрузке и могут загружать несколько файлов за один раз.

3 голосов
/ 23 февраля 2009

При загрузке очень больших файлов необходимо изменить 4 переменные конфигурации:

  • upload_max_filesize
  • post_max_size
  • memory_limit
  • time_limit

Лимит времени может быть увеличен во время выполнения с помощью set_time_limit ().

2 голосов
/ 23 февраля 2009

По умолчанию скрипт может запускаться примерно 30 секунд. Вы можете использовать функцию set_time_limit () , чтобы изменить это. Кроме того, если вашему пользователю потребуется загружать большие файлы, вам необходимо изменить значения post_max_size и / или upload_max_filesize в файле php.ini.

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

1 голос
/ 13 мая 2013

Я смог решить эту проблему, используя следующие настройки, вы можете использовать разные значения, но вы поняли:

Для моего сервера я помещаю эти строки в файл ".user.ini" внутри каталога скриптов, ваш сервер может искать другой файл, если вы делаете phpinfo ('user_ini.filename') на сервере, который он выложит файл, в который нужно поместить ваши значения в

max_execution_time = 1800
max_input_time = -1
post_max_size = 100M
upload_max_filesize = 100M
memory_limit = 256M
1 голос
/ 29 марта 2009

Мой ответ не имеет прямого отношения к вашему исходному вопросу, но если перед вашим PHP-скриптом установлен балансировщик нагрузки обратного прокси-сервера, балансировщик нагрузки может заблокировать тайм-аут или заблокировать большие загрузки. Всегда проверяйте конфигурацию своего балансировщика нагрузки, если вы поддерживаете загрузку файлов. Как и в PHP, для большинства загрузок стандартные настройки балансировки нагрузки довольно малы.

1 голос
/ 23 февраля 2009

Проблемы могут вызывать не только тайм-ауты. Существуют некоторые ограничения на максимальный размер файла, который может быть загружен. Эти ограничения можно изменить в файле php.ini:

post_max_size
upload_max_filesize memory_limit

Подробнее http://uk.php.net/ini.core.

1 голос
/ 23 февраля 2009

Да, это правда. Загрузка файла осуществляется через POST-запрос, и запросы в общем случае могут быть задержаны. Вы должны быть в состоянии перенастроить свою среду для более длительного времени ожидания запроса.

0 голосов
/ 08 мая 2019

Это как раз решение вашей проблемы, Sserver перерыв в ожидании HTTP-запроса от клиента. Это означает, что вы отправляете запрос с https: // на https: //, и браузер сообщает, что ожидает http-запрос, поэтому вы должны отправить запрос с https: // на http: //. В любом случае это решение работает.

...