2013-02-22 6 views
7

In dem PHP-Handbuch gibt es einen Kommentar zu gzdeflate sagen:PHP: Ist Gzdeflate über mehrere Maschinen sicher?

gzcompress erzeugt Daten länger, weil es Informationen über die Codierung auf die Saite einbettet. Wenn Sie Daten komprimieren, die immer nur auf einer Maschine behandelt werden, brauchen Sie sich keine Sorgen darüber, welche dieser Funktionen Sie verwenden. Wenn Sie jedoch Daten, die mit diesen Funktionen komprimiert wurden, an eine andere Maschine weitergeben, sollten Sie gzcompress verwenden.

und dann

50000 Wiederholungen auf verschiedenen Inhalte ausgeführt wird, fand ich, dass gzdeflate() und gzcompress(), die beide gleich schnell durchgeführt, unabhängig Inhalt und Kompression, aber gzinflate() war immer über doppelt so schnell wie gzuncompress().

Für meinen Zweck archiviere ich Daten auf einer Maschine für zukünftige Verwendung. Die Daten werden oft gelesen, aber nur einmal geschrieben. Theoretisch wird es eines Tages auf eine andere Maschine verschoben werden, wenn ich irgendwann den Server wechsele, aber das sind ein paar Jahre später.

Ist es sicher für mich, gzdeflate und gzinflate im Gegensatz zu gzcompress und gzuncompress zu verwenden?

Mein Denken ist wie folgt: Gzinflate ist schneller und das wird dem Server sehr helfen, da es viele Leseanforderungen gibt. Wenn ich irgendwann in der Zukunft die Datei nicht lesen kann, sollte ich in der Lage sein, herauszufinden, wie man die Datei dekomprimiert und erneut komprimiert, oder? Es ist nicht so, dass das Gzinflat eines Tages auf magische Weise nicht funktionieren wird, wie der erste Kommentar zu sagen scheint. Selbst wenn ich einen Header von 6 Byte verpasse, bin ich mir sicher, dass es irgendwie erweiterbar sein wird.

Gedanken?

UPDATE - Benchmark

10.000 Iterationen jeweils:

gzdeflate took 19.158888816833 seconds and size 18521 
gzinflate took 1.4803981781006 seconds 
gzcompress took 19.376484870911 seconds and size 18527 
gzuncompress took 1.6339199542999 seconds 
gzencode took 20.015944004059 seconds and size 18539 
gzdecodetook 1.8822891712189 seconds 

Antwort

9

Der Kommentar ist Unsinn. Sie können einen der folgenden Werte verwenden: gzcompress, gzdeflate oder gzencode, um komprimierte Daten zu erstellen, die überall portabel dekomprimiert werden können. Diese Funktionen unterscheiden sich nur im Wrapper um die Deflate-Daten (RFC 1951). gzcompress hat einen Zlib Wrapper (RFC 1950), gzdeflate hat keinen Wrapper und gzencode hat einen gzip Wrapper (RFC 1952).

Ich würde nicht mit gzdeflate empfehlen, da kein Wrapper keine Integritätsprüfung bedeutet. gzdeflate sollte nur verwendet werden, wenn ein anderer Wrapper außerhalb davon erzeugt wird, z. für Zip-Dateien, die auch das Deflate-Format verwenden. Der Kommentar zur Geschwindigkeit ist mit ziemlicher Sicherheit falsch. Die Integritätsprüfung von gzuncompress() benötigt im Vergleich zur Dekomprimierung sehr wenig Zeit. Sie sollten Ihre eigenen Tests machen.

Aus diesem einen Beispiel könnte ich übergeneralisieren, aber ich würde sagen, dass Sie die Kommentare in der PHP-Dokumentation vollständig ignorieren sollten. Sie sind großzügig, uninformiert.

Übrigens, diese Funktionen sind auf eine schrecklich verwirrende Art und Weise benannt. Nur gzencode sollte "gz" im Namen haben, da das der einzige von denen ist, die tatsächlich im Format .gz handelt. gzcompress klingt, als würde es sich im gzip-Format komprimieren, aber tatsächlich komprimiert es sich auf das zlib-Format.

+0

Vielen Dank für Ihre Antwort. Das hilft mir sehr. Bitte denken Sie auch daran, Ihre Antwort in der php.net Dokumentation zu veröffentlichen. – Alasdair

Verwandte Themen