Frage

Ich schreibe einen PHP-Skript, die gzip-Dateien erzeugt. Der Ansatz, den ich verwendet habe, ist eine Zeichenfolge in PHP aufzubauen und gzcompress () die Zeichenfolge, bevor es in eine Datei am Ende des Skripts zu schreiben.

Jetzt teste ich mein Skript mit größeren Dateien und läuft in Speicherzuordnungsfehler. Es scheint, dass das Ergebnis-String wird immer zu groß im Speicher auf einmal zu halten.

Um dies zu lösen, habe ich versucht gzopen () und gzwrite () zu verwenden, zu vermeiden, dass eine große Zeichenfolge in PHP zuordnet. Allerdings ist die gzip-Datei mit gzwrite erzeugt () ist ganz anders aus, wenn ich verwende gzcompress (). Ich habe mit verschiedenen Zip-Ebenen experimentiert, aber es hilft nicht. Ich habe auch gzdeflate () und am Ende mit dem gleichen Ergebnis wie gzwrite () versucht, mit, aber immer noch nicht ähnlich (), um gzcompress. Es ist nicht nur die ersten zwei Bytes (zlib-Header), die unterschiedlich sind, ist es die gesamte Datei.

Was bedeutet gzcompress () anders aus diesen anderen gzip-Funktionen in PHP? Gibt es eine Möglichkeit ich die Ergebnisse gzcompress emulieren kann (), während schrittweise das Ergebnis produzieren?

War es hilfreich?

Lösung

Ich bin nicht 100% sicher, aber meine Vermutung ist, dass gzcompress verwendet GZIP-Format und gzopen / gzwrite Verwendung ZLIB. Ehrlich gesagt, ich kann Ihnen nicht sagen, was der Unterschied zwischen den beiden ist, aber ich weiß, dass GZIP verwendet ZLIB für die tatsächliche Komprimierung.

Es ist möglich, dass nichts davon, obwohl Materie wird. Versuchen Sie, eine gzip-Datei mit gzopen / gzwrite erstellen und dann entpacken Sie es die Befehlszeilen gzip-Programm. Wenn es funktioniert, dann mit gzopen / gzwrite für Sie arbeiten.

Andere Tipps

Der Hauptunterschied ist, dass die Funktion gzwrite zlib mit der Option SYNC_FLUSH einleitet, die wird Pad die Ausgabe in eine 4-Byte-Grenze (oder ist es 2), und dann ein wenig extra (0x00 0x00 0xFF 0x03 0xFF).

Wenn Sie diese verwenden, Zip-Dateien zu erstellen, passen sie, dass der Standard Mac Archive Utility dieses Format nicht unterstützt.

Von dem, was ich sagen kann, SYNC_FLUSH ist eine gzip-Option und wird in der PKZip / Info-ZIP-Format, alle .zip-Dateien und deren Derivate nicht erlaubt kommen.

Wenn Sie eine kleine Datei / Text abzulassen, in einem einzigen deflate Block führt, und vergleichen Sie es mit dem gleichen Text mit gzwrite geschrieben, werden Sie zwei Unterschiede sehen, eines der Bytes in der Kopfzeile des abgelassenen Block unterscheidet um 1, und das Ende ist mit den oben Bytes aufgefüllt. Wenn das Ergebnis größer als ein deflate Block, beginnen die Unterschiede häufen sich. Es ist schwer, dieses Problem zu beheben, da die deflate Stream Block-Header nicht einmal Byte ausgerichtet sind. Es gibt einen Grund jeder die zlib verwendet. Nur wenige Menschen sind mutig genug, um auch zu versuchen, dieses Format neu zu schreiben!

Ich lief in ein ähnliches Problem, wenn - im Grunde nicht genügend RAM dort PHP zugewiesen war, das Geschäft zu tun.

beenden ich die Zeichenfolge als Textdatei zu speichern, dann exec (), um die Datei gzip das Dateisystem verwenden. Es ist nicht eine ideale Lösung, aber es funktioniert für meine Situation.

versuchen, den Parameter memory_limit in Ihrer php.ini zu erhöhen

Sowohl gzcompress () und gzopen () verwenden, um die DEFLATE Verfahren zum Komprimieren von Blöcken. Aber sie haben unterschiedliche Kopf- / Anhänger.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top