2011-01-06 7 views
8

Ich versuche, eine Datei größer als 2 GB auf einen lokalen PHP 5.3.4 Server hochzuladen. Ich habe die folgenden Servervariablen:Upload einer Datei größer als 2 GB mit PHP

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

jedoch in der error_log ich gefunden:

PHP Warning: POST Content-Length von 2120909412 Bytes auf Linie die Grenze von 1073741824 Bytes in Unknown überschreitet 0

Kann mir jemand sagen, warum das bitte scheitert?

+3

HTTP ist wirklich nicht die richtige Wahl des Protokolls zum Hochladen einer 2GB-Datei. Sie sollten (S) FTP dafür verwenden. –

+3

Haben Sie verifiziert, dass diese Variablen verwendet werden? (dh durch 'phpinfo()') PHP hört nie auf, mich zu überraschen, welche Konfigurationsdatei es gerade liest ... (Auch HTTP ist dafür nicht gedacht ...) – Thanatos

+1

Warum wollen Sie PHP dafür verwenden? anstelle von etwas wie FTP oder einer anderen Nummer oder anderen Möglichkeiten zum Hochladen von Dateien – Earlz

Antwort

2

Vielleicht kann dies kommen von Apache Einschränkungen auf POST Größe:

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

Es scheint, diese Beschränkung auf 2 GB mehr auf 64bits Installationen sein kann, vielleicht. Und ich bin nicht sicher, 0 in diesem directiveove zu setzen, erreicht das Kompilierungslimit nicht. siehe Beispiele dieser Thread:

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

Dann vergessen Sie nicht, auch die max_input_time in PHP zu ändern.

Aber Sie erreichen hohe Grenzen :-) Vielleicht könnten Sie versuchen, einen Rich-Client (flash? Js?) Auf der Browserseite, die Übertragung in Chunks oder eine Art FTP-Dinge, mit Fortschrittsanzeigen für den Benutzer.

+0

Ich versuchte die gleiche Operation auf einem 64-Bit-Betriebssystem und hatte keinerlei Probleme. Danke für Ihre Hilfe. – Reado

3

Ich weiß nicht über in 5.3.x, aber in 5.2.x gibt es einige int/long Probleme im PHP-Code. Selbst wenn Sie auf einem 64-Bit-System arbeiten und eine Version von PHP mit 64-Bit kompiliert haben, gibt es mehrere Probleme.

Zuerst wandelt der Code, der post_max_size und andere von ASCII in Ganzzahl konvertiert, den Wert in ein int, so dass "9G" konvertiert und das Ergebnis in dieses int gesetzt wird, weil 9G eine größere Zahl als 32 ist -Bit Variable kann halten.

Aber es gibt auch einige andere Bereiche von PHP-Code, die mit dem Apache-Modul, CGI, etc. verwendet werden, die von int zu lang geändert werden müssen.

Damit dies funktioniert, müssen Sie den PHP-Code bearbeiten und manuell kompilieren (stellen Sie sicher, dass Sie ihn als 64-Bit kompilieren). Hier ist ein Link zu einer Liste von diffs:

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

von dem PHP Bug Beitrag referenzierte: http://bugs.php.net/bug.php?id=44522

Die Datei oben ist ein diff auf 5.2.10 Code, aber ich habe nur die Änderungen von Hand zu 5.2.17 code und ich habe gerade eine 3.4gb einzelne datei über apache/php hochgeladen (was vor der änderung nicht funktioniert hatte).

das hilft.

3

Ich hatte ein ähnliches Problem, aber meine Config war:

post_max_size = 1.8G 
upload_max_filesize = 1.8G 

und doch konnte ich nicht eine 1,2 GB-Datei hochladen.Der Fehler war sehr gleich:

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

Ich verbrachte einen Tag fragen, wo zum Teufel war das „limit of 1073741824“ aus Richtung!

Lösung:

Eigentlich war der Fehler in der php.ini-Parser: Es versteht Zahlen INTEGER nur, so wurde im Wesentlichen es 1.8G als 1G Parsen !!

Ändern des Werts z. 1800M hat es behoben.

Pls sorgen für den Apache-Server mit dem folgenden Befehl Service apache2 Neustart

+0

Ich habe Stunden versucht herauszufinden, was könnte das Problem mit einer OwnCloud-Installation für das Hochladen von großen Dateien sein, und das war das Problem schließlich. – Ark74

1

Wie phliKtid erwähnte neu zu starten, ist dies eine Einschränkung mit dem PHP-Framework. Speichern Sie für die Bearbeitung des Quellcodes, wie in der bug report phliKtid verknüpft, gibt es eine Problemumgehung, die upload_max_filesize in der php.ini-Datei auf 0 setzt.

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

dies tun, PHP wird nicht abstürzen, wenn sie versuchen zu konvertieren „5G“ in ein 32-Bit-Integer und Sie werden in der Lage sein, Dateien so groß zu laden, wie Sie mit dem „post_max_size“ Variable ermöglichen.

1

ich herausfinden, wie http und PHP verwenden, um eine 10G hochladen Datei.

php.ini:

post_max_size = 0 
upload_max_filesize = 0 

Es funktioniert in PHP 5.3.10.

Wenn Sie diese Datei nicht alle in den Speicher laden, ist memory_limit nicht verwandt.

Verwandte Themen