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

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

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

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

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

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

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

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

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

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

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

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

Я не знаю о 5.3.x, но в 5.2.x есть некоторые int / long проблемы в PHP-коде. даже если вы находитесь в 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

Ссылка на эту фразу: http://bugs.php.net/bug.php?id=44522

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

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

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

 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 зафиксировало его.

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

Как упоминал 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 не имеет отношения.

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

В SLES (SUSE Linux Enterprise Server) 11 с пакетом обновления 2 (SP2) возникла проблема с php53.

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

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