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

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

Вот визуализация связанного phpinfo(): http://codepen.io/jboneca/pen/bNvEwV

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

  • На нашем сервере никогда не хранится ни один файл. Он загружается (в большинстве случаев успешно) прямо в Dropbox.
  • Ограничение размера файла отключено в Dropzone.
  • Следующие настройки были изменены безрезультатно.upload_max_filesize, post_max_size, max_execution_time, max_input_time, memory_limit. Может быть, они должны быть еще больше?

person emsoff    schedule 18.02.2015    source источник


Ответы (1)


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

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