Загрузка файла размером более 2 ГБ с использованием PHP - PullRequest
9 голосов
/ 06 января 2011

Я пытаюсь загрузить файл размером более 2 ГБ на локальный сервер PHP 5.3.4. Я установил следующие переменные сервера:

memory_limit = -1
post_max_size = 9G
upload_max_filesize = 5G

Однако в error_log я обнаружил:

Предупреждение PHP: POST Content-Length в 2120909412 байт превышает предел в 1073741824 байт в Unknown в строке 0

Может кто-нибудь сказать мне, почему это не работает, пожалуйста?

Ответы [ 6 ]

6 голосов
/ 28 июля 2012

У меня была похожая проблема, но мой конфиг был:

post_max_size = 1.8G
upload_max_filesize = 1.8G

и все же я не мог загрузить файл размером 1,2 ГБ. Ошибка была очень та же:

PHP Warning:  POST Content-Length of 1347484420 bytes exceeds the limit of 1073741824 bytes in Unknown on line 0

Я провел день, размышляя, откуда, черт возьми, этот «предел 1073741824»!

Решение

На самом деле ошибка была в синтаксическом анализаторе php.ini: он понимает только числа INTEGER, поэтому по сути он анализировал 1.8G как 1G !!

Изменение значения, например, 1800M исправил это.

Просьба перезапустить сервер apache с помощью следующей команды service apache2 restart

3 голосов
/ 10 февраля 2011

Я не знаю, как в 5.3.x, но в 5.2.x есть некоторые проблемы int / long в коде PHP.даже если вы работаете в 64-битной системе и у вас есть версия PHP, скомпилированная с 64-битной версией, есть несколько проблем.

Во-первых, код, который преобразует post_max_size и другие из ascii в целое, сохраняет значениев int, поэтому преобразование «9G» и помещение результата в это int будет скрывать значение, потому что 9G - это большее число, чем может содержать 32-битная переменная.

Но есть и несколько других областейPHP-код, используемый с модулем Apache, CGI и т. Д., Который необходимо изменить с int на long.

Итак ... чтобы это работало, вам нужно отредактировать код PHP и скомпилировать его с помощьюрукой (убедитесь, что вы скомпилировали его как 64-битную).Вот ссылка на список различий:

http://www.archive.org/~tracey/downloads/patches/karmic-64bit-post-large-files.patch

Ссылка на это сообщение об ошибке в php: http://bugs.php.net/bug.php?id=44522

Файл выше представляет собой различие в 5.2.10код, но я только что внес изменения вручную в код 5.2.17, и я только что загрузил отдельный файл 3.4 ГБ через apache / php (который не работал до изменения).

, что помогает.

2 голосов
/ 06 января 2011

Возможно, это может быть связано с ограничениями Apache для размера POST:

http://httpd.apache.org/docs/current/mod/core.html#limitrequestbody

Кажется, это ограничение на 2 Гб может быть больше на 64-битных установках, возможно.И я не уверен, что установка 0 в этом directove не достигает предела компиляции.посмотрите примеры этого потока:

http://ubuntuforums.org/archive/index.php/t-1385890.html

Тогда не забудьте также изменить max_input_time в PHP.

Но вы достигли высоких пределов :-) возможноВы могли бы попробовать расширенный клиент (flash? js?) на стороне браузера, выполняя передачу по частям или что-то вроде FTP, с индикаторами прогресса для пользователя.

1 голос
/ 04 сентября 2013

Я выясняю, как использовать http и php для загрузки файла 10G.

php.ini:

post_max_size = 0
upload_max_filesize = 0

Это работает в php 5.3.10.

если вы не загружаете этот файл все в память, memory_limit не имеет отношения.

1 голос
/ 23 января 2013

Как упоминалось в phliKtid, это ограничение для PHP-фреймворка. Сохраните для редактирования исходного кода, как указано в отчете об ошибке phliKtid связанный, существует обходной путь, который включает установку upload_max_filesize в 0 в файле php.ini.

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 0

При этом PHP не будет аварийно завершать работу при попытке преобразовать «5G» в 32-разрядное целое число, и вы сможете загружать файлы настолько большого размера, насколько это возможно с переменной «post_max_size».

0 голосов
/ 22 июля 2013

У нас была та же проблема: загрузка остановилась на 2 ГБ.

В SLES (SUSE Linux Enterprise Server) 11 SP 2 проблема с php53.

Затем мы добавили новый репозиторий с php54: http://download.opensuse.org/repositories/server:/php/SLE_11_SP2/

и обновившись до этого, теперь мы можем загрузить 5 ГБ: -)

...