2009-03-07 4 views
51

Ich habe eine große Menge an Daten zu verschieben mit zwei PHP-Skripten: eine auf der Client-Seite mit einer Befehlszeile PHP-Skript und andere hinter Apache. Ich POST die Daten an die Server-Seite und verwenden Sie php: // Eingabestream, um es auf dem Webserver-Ende zu speichern. Um zu verhindern, dass Speichergrenzen erreicht werden, werden die Daten für jede POST-Anforderung in 500-KB-Blöcke aufgeteilt. All das funktioniert gut.Welche Komprimierungsmethode wird in PHP verwendet?

Jetzt, um die Bandbreite zu speichern und zu beschleunigen, möchte ich die Daten vor dem Senden und Dekomprimieren komprimieren, wenn am anderen Ende empfangen. Ich fand drei Paare von Funktionen, die die Arbeit erledigen kann, aber ich kann nicht entscheiden, welche man verwenden:

Welches Paar von Funktionen würden Sie empfehlen und warum?

UPDATE: ich gerade zlib FAQ lesen:

Das gzip-Format (gzencode) wurde entwickelt, um die Verzeichnisinformationen über eine einzige Datei, wie zB den Namen und Datum der letzten Änderung zu behalten. Das zlib-Format (gzcompress) wurde dagegen für In-Memory- und Kommunikationskanal-Anwendungen entwickelt, hat einen viel kompakteren Header und Trailer und verwendet eine schnellere Integritätsprüfung als gzip.

+1

'gzdecode()' scheint in php noch nicht verfügbar zu sein, also vermeide es. –

+1

'gzdecode()' ist nur für PHP 5.4.0 oder neuer definiert: http://php.net/manual/en/function.gzdecode.php –

Antwort

62

Alle diese können verwendet werden. Es gibt feine Unterschiede zwischen den drei:

  • gzencode() verwendet das GZIP-Dateiformat, das gleiche wie das gzip Kommandozeilen-Tool. Dieses Dateiformat enthält eine Kopfzeile mit optionalen Metadaten, komprimierten DEFLATE-Daten und Fußzeilen, die eine CRC32-Prüfsummen- und Längenprüfung enthalten.
  • gzcompress() verwendet das ZLIB-Format. Es hat einen kürzeren Header, der nur dazu dient, das Komprimierungsformat zu identifizieren, DEFLATE-komprimierte Daten und eine Fußzeile, die eine ADLER32-Prüfsumme enthält.
  • gzdeflate() verwendet den rohen DEFLATE-Algorithmus allein, der die Grundlage für beide anderen Formate bildet.

Alle drei verwenden den gleichen Algorithmus unter der Haube. gzencode() fügt die Möglichkeit hinzu, den ursprünglichen Dateinamen und andere Umgebungsdaten anzugeben (dies wird nicht verwendet, wenn nur eine Zeichenfolge komprimiert wird). gzencode() und gzcompress() fügen beide eine Prüfsumme hinzu, so dass die Integrität des Archivs verifiziert werden kann, was gegenüber unzuverlässigen Übertragungs- und Speichermethoden nützlich sein kann. Wenn alles lokal gespeichert ist und Sie keine zusätzlichen Metadaten benötigen, würde gzdeflate() ausreichen. Für die Portabilität empfehle ich gzencode() (GZIP-Format), die wahrscheinlich besser als gzcompress() (ZLIB-Format) unter anderen Tools unterstützt wird.

+3

Fast korrekt. Ich habe ein wenig nachgeforscht, und es scheint, dass gzencode keine Header-Daten enthält - es hat nur andere Header-Daten. –

+2

@Milan Ich denke, du meinst "gzcompress ist nicht ohne Kopfdaten - es hat nur andere Kopfdaten". – thomasrutter

4

Alle Methoden sind im Wesentlichen die gleichen, der Unterschied zwischen ihnen ist meist in den Headern. Persönlich würde ich gzencode verwenden, dies erzeugt eine Ausgabe, die einem Kommandozeilenaufruf für das gzip-Dienstprogramm entspricht.

39

Ich bin kein PHP-Experte und kann die gestellte Frage nicht beantworten, aber es scheint, als würde hier viel raten und unscharfe Informationen angeboten.

DEFLATE ist der Name des Komprimierungsalgorithmus, der von ZLIB, GZIP und anderen verwendet wird. Theoretisch unterstützt GZIP alternative Komprimierungsalgorithmen, aber in der Praxis gibt es keine.

Es gibt keinen "GZIP-Algorithmus". GZIP verwendet den DEFLATE-Algorithmus und legt Framing-Daten um die komprimierten Daten herum. Mit GZIP können Sie Dinge wie den Dateinamen, den Zeitpunkt der Datei, eine CRC, sogar einen Kommentar hinzufügen. Diese Metadaten sind jedoch optional und viele gzippers lassen sie einfach weg.

ZLIB ist ähnlich, außer mit einem anderen, eingeschränkteren Satz von Metadaten und einem spezifischen 2-Byte-Header.

Dies ist alles in IETF RFCs 1950, 1951 und 1952.

Zu sagen, dass "der Gzip-Algorithmus besser komprimiert als DEFLATE" ist einfach Unsinn. Es gibt keinen gzip-Algorithmus. Und der Algorithmus, der in dem GZIP-Format verwendet wird, ist DEFLATE.

+0

Danke für die Klärung. Bis das Lesen nichts Sinn machte ... – rvighne