Эта проблема, похоже, напрямую связана с печально известным лимитом 2 ГБ, и я не уверен в этом, если его проблема с 32-битным PHP. Я видел комментарии, связанные с HTTP, которые не предназначены для таких больших файлов. Тем не менее, я предпочел бы исчерпать это направление, прежде чем принимать решение о каких-либо фундаментальных изменениях в отношении того, что было доказано в настоящее время. Как следует из названия, мне нужно загрузить > 2 ГБ файлов, самый большой на сегодняшний день 3,8 ГБ. У меня есть форма, построенная с использованием jQuery-file-upload, у которой не было проблем с отправкой каких-либо файлов (все меньше и меньше 2 ГБ) до тех пор, пока не начнутся эти большие. 3,8 ГБ занимает около 5 минут для загрузки из файла-загрузки, а индикатор выполнения достигает 100%. Однако сообщенная ошибка после загрузки является типом 1, который предполагает ограничение размера файла.
Если я отслеживаю использование диска на сервере во время загрузки, он будет иметь следующие свойства образца: Перед загрузкой диска используется 30%, так как загрузка продолжается, это увеличение увеличивается, 31%, 32%.... 45%, 46% и т.д. Однако примерно в 2 Гбайт точки использования диска снижаются до 30%, тогда как загрузка файлов клиент/браузер продолжается. Когда использование дискового пространства серверов перестает увеличиваться, клиент может получить только 60% загрузки. Тем не менее клиент по-прежнему остается на 100%, но не принимается сервером, так как состояние диска никогда не отключается на 30%.
Я запускаю 64Bit Ubuntu (последний) с Apache/2.2.22 (Ubuntu) и PHP версии 5.3.10-1ubuntu3.2 После многодневного поиска и поиска решения я все равно не могу загрузить файл 3.8GB после изменения так много настроек. Я приведу список изменений ниже, но на этом этапе я думаю, что это может быть 32-битная проблема с PHP, поэтому, если кто-то может предложить ссылку, стоящую за ней или ее решение, я бы это оценил.
В Apache2 я установил следующее:
- apache2.conf I've set Timeout to 900
- httpd.conf I've set LimitRequestBody to 0
- .htaccess in the file upload directory I've set:
- LimitRequestBody to 4939212390
- php_value upload_max_filesize 4831838208
- php_value post_max_size 4939212390
В php.ini я установил следующее:
- UPLOAD_MAX_FILESIZE 4831838208
- POST_MAX_SIZE 4939212390
- max_execution_time 120
- max_input_time 60
- memory_limit 128M
Если я запустил на сервере следующее: кажется, что у PHP нет 32-разрядной проблемы, но я не уверен на этом этапе.
php -r "echo PHP_INT_MAX;"
9223372036854775807
Как я уже говорил, любые идеи были бы весьма полезны.
UPDATE:
Решили эту проблему, поэтому благодаря @BogdanBurim за то, что вы предложили обратный подход к основам:
Мне удалось загрузить файл размером 3,8 ГБ по HTTP со следующими настройками:
В Apache2 я установил следующее:
- apache2.conf I've set Timeout to 900
- httpd.conf I've set LimitRequestBody to 0
- .htaccess in the file upload directory I've set:
- LimitRequestBody to 0
- php_value upload_max_filesize 0
- php_value post_max_size 4939212390
- .htaccess in the php temp directory (in my case its /tmp/) I've set:
- LimitRequestBody to 0
- php_value upload_max_filesize 0
- php_value post_max_size 4939212390
В php.ini я установил следующее:
- UPLOAD_MAX_FILESIZE 0
- POST_MAX_SIZE 4939212390
- max_execution_time 120
- max_input_time 60
- memory_limit 128M
Единственной важной частью этого решения было удаление MAX_FILE_SIZE, HTML из формы загрузки:
<input type="hidden" name="MAX_FILE_SIZE" value="4939212390" />
Наличие этого набора постоянно вызывало ошибку типа PHP 2, поэтому php не смог обработать установленное более 32-битное целое число. Удаление этого вызвало ошибки PHP типа 1, пока я не изменил UPLOAD_MAX_FILESIZE на 0 всюду, и hey presto теперь работает!!!!