Загрузка файла размером более 2 ГБ с помощью PHP

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

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

однако в error_log я нашел:

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

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

6 ответов


возможно, это может исходить из ограничений apache на размер сообщения:

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

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

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

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

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


у меня была аналогичная проблема, но моя конфигурация была:

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 parser: он понимает только целые числа, поэтому по существу это был разбор 1.8G as 1G !!

изменение значения для например,1800M исправил.

Pls убедитесь, чтобы перезагрузить сервер apache с помощью следующей команды перезапуск службы apache2


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

во-первых, код, который преобразует post_max_size и другие из ascii в integer, сохраняет значение в 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 gb через apache/php (который не работал до изменения).

ope, который помогает.


Как упоминалось в 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".


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

php.ini:

post_max_size = 0
upload_max_filesize = 0

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

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


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

в SLES (SUSE Linux Enterprise Server) 11 SP 2 Проблема заключалась в php53.

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

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