2013-04-20 3 views
9

Ich habe Ordner, die Benutzer generierte Bilder haben, die ziemlich groß werden. Wenn ich versuche, diese zu komprimieren, bekomme ich Fehler bei 1,5 Gig-Zip-Dateien.php Zip-Archiv-Speicher, Ram und Max Dateigröße

Meine Fragen haben mit Speicher zu tun, und ich denke, dass PHP sowohl die Zip-Datei geöffnet und alle Bilder im Speicher hält. Eine mögliche Lösung, die ich habe, ist, jedes Bild beim Hochladen in die Zip-Datei zusätzlich zu dem entsprechenden Ordner zu senden, das scheint soweit zu funktionieren, aber was sind die Grenzen der Zip-Dateigröße, von dem ich ungefähr 4 GB finden kann. Wie wirkt sich dies auf die RAM-Menge auf dem Server aus? Wie hoch ist die Grenze? 4gb oder kann ich der Datei unendlich viele Dateien hinzufügen oder sollte das Skript die Größe der Zip-Datei überprüfen und über X liegen? Gigs benennen sie um und erstellen eine neue Zip-Datei. Ich habe google gesucht und die Dokumentation gelesen, habe aber widersprüchliche Informationen oder unvollständige Informationen gefunden, deshalb suche ich nach definitiven Antworten und Ratschlägen. Dank

+0

Wie viel Speicher können PHP-Skripte mit Ihrer Konfiguration haben (siehe php.ini ==> phpinfo() – Dukeatcoding

+1

Sie wäre besser dran Ausführen einer externen 'zip' über' exec() '. Sie wollen nicht ein PHP Prozess-Saugen Multi-Gigs von RAM –

+0

@Duke 32m out of the Box aber ich setze es auf 128m –

Antwort

2

Verwendung von PHP exec und rufen ein Zip-Tool auf der Kommandozeile

exec("tar -zcvf archive.tar.gz /folder/tozip"); 

Stellen Sie sicher, dass der Benutzer, die PHP-Datei Zugriff auf den Ordner, den Sie

zip wollen hat ausgeführt und nehmen Pflege des Injektionscodes.

+0

wird es eine Grenze geben für die Anzahl der Dateien oder die Größe der endgültigen Datei, die ich mit exec zippen kann? –

+0

normalerweise nicht, solange das Dateisystem die ausgehende Dateigröße verarbeiten kann – Dukeatcoding

9

Falls Sie noch die PHP ZipArchive verwenden möchten, gibt es ein paar Dinge, die Sie bestimmte Server/OS Einschränkungen tun können, um zu verhindern:

  • Speicher Obwohl es in Ihrem Fall offensichtlich erscheinen mag, Ich habe viele Beispiele zur Verwendung von ZipArchive gesehen, die addFromString verwenden, um dem Archiv eine neue Datei hinzuzufügen. NICHT! Dadurch wird Speicher zugewiesen, um die Datei zu öffnen und den Inhalt darin zu speichern. Dadurch wird der Speicher schnell verbraucht. Verwenden Sie stattdessen addFile. Stellen Sie außerdem sicher, dass Sie den gesamten Speicher freigeben, den Sie nicht benötigen.

  • Ausführungszeit die maximale Ausführungszeit für Ihr Skript erhöhen, entweder über die php.ini, oder mit ini_set (zB ini_set('max_execution_time', 600); eine maximale Ausführungszeit von 10 Minuten haben)

  • Datei-Handles Some OS hat Grenzen in der Anzahl der geöffneten Dateien, die ein Problem verursachen können, da PHP die Dateien nur dann zur ZIP hinzufügt, wenn Sie die ZIP-Datei schließen. Um Probleme mit der Anzahl der geöffneten Dateien zu vermeiden, schließen Sie die ZIP-Datei einfach und öffnen Sie alle x-Dateien erneut (z. B. alle 1000). Dadurch wird PHP gezwungen, die dem Archiv bereits zugewiesenen Dateien zu komprimieren und hinzuzufügen.

  • Dateigröße Es kann einige Dateigröße Einschränkungen des Betriebssystems, eine größere Datei bedeutet auch, dass PHP mehr Speicher um es verwalten muss, so dass ich persönlich bevorzuge eine maximale Dateigröße zu verwenden, nach dem ich eine gerade öffnen neue Zip-Datei mit einer Indexnummer. Wenn die genaue Dateigröße für Sie keine Rolle spielt, können Sie einfach die Größe der Dateien zählen, die in das Archiv gehen und dann wechseln, wenn Sie eine bestimmte Grenze erreicht haben, oder Sie können das Archiv alle x Dateien schließen und seine Größe auf der Festplatte überprüfen entscheiden, ob ein neues Archiv oder nicht starten (denken Sie daran, erhalten die Dateien nur komprimiert, sobald Sie schließen das Archiv)

ich persönlich mag die Dateigröße zu begrenzen, indem die Größe der Dateien immer in das Archiv gehen und einen wahrscheinlichen Kompressionsfaktor anwenden, um zu sehen, wann die maximale Archivgröße wahrscheinlich erreicht wird (jpg - Dateien ~ 0.9, Zip-Dateien = 1, Textdateien ~ 0.10, ...) und wechseln dann zum nächsten Volume.

+1

Sie haben gerade ein Leben gerettet !!! – Omolara

+0

Wäre 'addGlob()' eine bessere Option, um alle Dateien aus einem Ordner hinzuzufügen? – Mirko