Загрузка файла размером более 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: -)