Настройки php для больших загрузок (ошибка 413) [дубликаты]

0

Используя Dropzone.js и API Dropbox, я хочу настроить перетаскиваемый веб-интерфейс, способный принимать файлы до 10G. Он отлично работает с файлами до ~ 50M, но после этого сбой происходит с ошибкой 413 Request Entity Too Large. Пример файла, который я пытался, - 1.5G. Я пробовал то, что знаю, чтобы изменить для больших загрузок файлов, но все еще не работает. Я надеюсь, что кто-то может указать мне в правильном направлении, взглянув на мои настройки PHP.

Здесь рендеринг связанного phpinfo(): http://codepen.io/jboneca/pen/bNvEwV

Дополнительная информация:

  • На нашем сервере файл не хранится. Он загружается (успешно, в большинстве случаев) непосредственно в Dropbox.
  • Ограничение размера файла отключено в Dropzone.
  • Были изменены следующие настройки, но безрезультатно. upload_max_filesize, post_max_size, max_execution_time, max_input_time, memory_limit. Возможно, они должны быть еще большими?
Теги:
ini
dropbox-api
http-status-code-413

1 ответ

2
Лучший ответ

Несколько замечаний:

  1. Когда вы обрабатываете загрузку файла с помощью php, даже если ваш скрипт не заканчивает сохранение файла, а только для его отправки в Dropbox API - то, как он работает, PHP должен записать его во временное местоположение на сервере, например /TMP/tempfilename. Поэтому на вашем сервере должно быть достаточно места для хранения файла, хотя он просто временный. Затем ваш сценарий загружает файл через Dropbox API, а PHP автоматически очищает/удаляет файл из временного местоположения.
  2. Ошибка 413 Request Entity Too Large обычно возникает, когда post_max_size недостаточно велик для обработки вашего запроса, но в вашем случае у вас могут быть и другие проблемы, ограничивающие его.
  3. По моему опыту работы с сценариями php командной строки, обрабатывающими большие объемы данных, предел памяти php начинается с 1700M-2000M. Смысл, даже после установки memory_limit на что-то намного выше, сам php не смог обработать ограничение на ограничение памяти, которое велико, и терпит неудачу, если использование памяти превышает примерно 1800M. (возможно, он использует подписанный 32-битный int для ограничения памяти? Не уверен.)
  4. Я также работал с комбо с загрузкой файлов Dropzone.js + php и не испытывал проблем с загрузкой файлов в несколько сотен мегабайт. Я рекомендую вам попробовать: установите upload_max_filesize в 1100M, установите post_max_size в 1200M и установите memory_limit на 1700M. Теперь попробуйте файлы размером 100 МБ, затем 500 МБ, затем 1 ГБ. Я считаю, что это будет работать для всех этих размеров. Теперь настройте каждую настройку выше и посмотрите, как близко вы можете добраться до 1.5gb. Это, вероятно, предел текущей версии php и сервера, который у вас есть.
  5. Просто FYI, max_execution_time не является вашей проблемой, если ваша ошибка была 413 Request Entity Too Large. (вас еще нет) Это всего лишь время, необходимое для выполнения всех строк в вашем php-скрипте. (Если вы сохраняли файл на сервере локально, на этот раз было бы миллисекунды, даже если вы загрузили 1GB файл.) Однако, поскольку вам нужно отправить этот файл в Dropbox API с вашего сервера, возможно, ваш запрос будет слишком долго и превышать ограничение max_execution_time. Я считаю, что у вас возникнут проблемы с этим после того, как вы решите свою текущую проблему при загрузке. Чтобы решить эту проблему, я рекомендую, чтобы ваш PHP-запрос обрабатывал php-скрипт, чтобы просто добавить файл в очередь где-то, и иметь отдельный потребительский процесс, который читает из очереди и загружает файлы в Dropbox. (также, вероятно, лучший UX для ваших пользователей, так что им не нужно ждать в 2 раза)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню