Frage

Ich habe eine große Menge von Daten unter Verwendung von zwei PHP-Skripte zu bewegen: ein auf der Client-Seite eine Befehlszeile PHP-Skript und andere hinter Apache verwenden. Ich poste die Daten auf der Server-Seite und verwenden php: // input Stream es auf dem Web-Server Ende zu sparen. Um zu verhindern, erreichen Sie alle Speichergrenzen, werden die Daten für jeden POST-Anforderung in 500kB Stücke getrennt. Das alles funktioniert gut.

Nun, um die Bandbreite zu sparen und es beschleunigt, mag ich die Daten komprimieren, bevor das Senden und dekomprimieren, wenn am anderen Ende erhalten. Ich fand drei Paare von Funktionen, die die Arbeit erledigen können, aber ich kann nicht entscheiden, welche man verwenden:

Welche Paare Funktionen würden Sie empfehlen und warum?

UPDATE: Ich zlib FAQ gerade 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) auf der anderen Seite wurde entwickelt für In-Memory-und Kommunikationskanal-Anwendungen und hat ein viel kompaktere Header und Trailer und verwendet eine schnellere Integritätsprüfung als gzip.

War es hilfreich?

Lösung

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

  • gzencode () verwendet die GZIP-Datei Format, das gleiche wie das gzip Befehlszeilenprogramm. Dieses Dateiformat hat einen Header optional Metadaten enthält, DEFLATE komprimierte Daten und Fußzeile eine CRC32 und Längenprüfung enthält.
  • gzcompress () verwendet die ZLIB-Format . Es verfügt über einen kürzeren Header dient nur das Komprimierungsformat zu identifizieren, komprimierte Daten DEFLATE und eine Fußzeile eine ADLER32 Prüfsumme enthält.
  • gzdeflate () verwendet die rohen DEFLATE Algorithmus auf seine eigene, die die Grundlage für die beiden anderen Formaten ist.

Alle drei den gleichen Algorithmus unter der Haube verwenden. gzencode() bietet die Möglichkeit, die ursprünglichen Dateinamen und andere Umweltdaten enthalten (diese nicht benutzt wird, wenn nur eine Zeichenfolge komprimiert). gzencode() und gzcompress() sowohl eine Prüfsumme hinzuzufügen, so dass die Integrität des Archivs kann überprüft werden, was nützlich über Methoden unzuverlässig Übertragung und Speicherung sein kann. Wenn alles lokal gespeichert ist und Sie brauchen keine zusätzlichen Metadaten dann würde gzdeflate() ausreichen. Für Portabilität würde ich gzencode() (GZIP-Format) empfehlen, die als gzcompress() (ZLIB-Format) unter anderen Tools unterstützt wahrscheinlich besser ist.

Wenn sehr kurze Strings Komprimieren der Aufwand für jede Methode wird relevant für sehr kurze Eingabe, da der Kopf einen wesentlichen Teil der Ausgabe umfassen. Der Overhead für jede Methode, gemessen durch eine leere Zeichenfolge komprimiert ist:

  • gzencode('') = 20 Bytes
  • gzcompress('') = 8 Bytes
  • gzdeflate('') = 2 Bytes

Andere Tipps

Ich bin kein PHP-Experte und kann die Frage gestellt, nicht beantworten, aber es scheint, wie es eine Menge ist hier zu raten los, und Fuzzy-Information dargebotene werden.

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

Es gibt nicht so etwas wie „den GZIP-Algorithmus“. GZIP verwendet den DEFLATE Algorithmus, und Framing-Daten um die komprimierten Daten setzt. Mit GZIP können Sie Dinge wie die Dateinamen hinzufügen, die Zeit der Datei, eine CRC, auch einen Kommentar. Diese Metadaten sind optional, aber, und viele gzippers es einfach weglassen.

ZLIB ist ähnlich, außer mit einem anderen, begrenzten Satz von Metadaten und ein speziellen 2-Byte-Header.

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

Zu sagen, dass „der gzip-Algorithmus komprimiert besser als DEFLATE“ ist nur Unsinn. Es gibt keinen gzip-Algorithmus. Und der Algorithmus im GZIP-Format verwendet wird, ist DEFLATE .

Alle Verfahren im Wesentlichen gleich sind, ist der Unterschied zwischen ihnen meist in den Headern. ich persönlich gzencode verwenden würde, wird diese Ausgabe erzeugen, die zu einem Kommandozeilen-Aufruf an das gzip-Dienstprogramm entsprechen.

Ich hatte eine gzip komprimierte Datei in PHP mit C ++ zu dekomprimieren. Ich fand heraus, dass die PHP gzencode und sein Gegenstück gzdecode die Z_NO_FLUSH Methode verwenden, und am Ende des Blocks der Daten / decode zu codieren, wendet Z_FINISH. Das Beispiel / Tutorial in C auf der zlib Webseite gezeigt verwendet werden, dekomprimieren und gziped Dateien von PHP, solange das Fenster Bit und die Speicherebene zu komprimieren geändert gzip Deflationen und Inflationen zu ermöglichen.

Extras: Es scheint, die meisten Menschen in diesem Thread haben keine Ahnung, was „Kompressionsmethode“ gemeint

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