2013-02-22 16 views
7

W podręczniku PHP jest komentarz na gzdeflate mówiąc:PHP: Czy gzdeflate jest bezpieczny na wielu komputerach?

gzcompress produkuje dłuższe danych, ponieważ osadza informacje kodowanie na sznurku. Jeśli kompresujesz dane, które będą tylko obsługiwane na jednym komputerze, nie musisz się martwić o to, której z tych funkcji używasz. Jeśli jednak przekazujesz dane skompresowane tymi funkcjami do innej maszyny, powinieneś użyć użyć gzcompress.

a następnie

uruchomiony 50000 powtórek w różnej zawartości, stwierdziliśmy, że gzdeflate() i gzcompress() zarówno wykonywane równie szybko niezależnie treści i poziom kompresji, ale gzinflate() był zawsze o dwa razy szybciej niż gzuncompress().

Dla moich celów archiwizuję dane na komputerze do wykorzystania w przyszłości. Dane są często czytane, ale zapisywane tylko raz. Teoretycznie pewnego dnia zostanie przeniesiony na inną maszynę, jeśli zmienię serwery w pewnym momencie, ale to jest kilka lat później.

Czy mogę bezpiecznie używać gzdeflate i gzinflate w przeciwieństwie do gzcompress i gzuncompress?

Moje myślenie jest następujące: gzinflate jest szybsze, a to bardzo pomoże serwerowi, ponieważ będzie wiele żądań odczytu. Jeśli w pewnym momencie w przyszłości nie będę mógł odczytać pliku, powinienem być w stanie wymyślić, jak rozpakować plik i skompresować go, prawda? Nie chodzi o to, że gzinflate po prostu nie zadziała w magiczny sposób pewnego dnia, tak jak wydaje się mówić pierwszy komentarz. Nawet jeśli brakuje 6-bajtowego nagłówka, jestem pewien, że jakoś się rozwinie.

Myśli?

UPDATE - Benchmark

10000 iteracji każda:

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 

Odpowiedz

9

Komentarz jest nonsens. Możesz użyć dowolnego z gzcompress, gzdeflate lub gzencode, aby wytworzyć skompresowane dane, które można dowolnie rozpakować. Te funkcje różnią się tylko w opakowaniu wokół danych deflate (RFC 1951). gzcompress ma opakowanie zlib (RFC 1950), gzdeflate nie ma opakowania, a gzencode ma opakowanie gzip (RFC 1952).

Polecam nie przy użyciu gzdeflate, ponieważ żadne opakowanie nie oznacza kontroli integralności. gzdeflate należy używać tylko wtedy, gdy poza tym generowane jest inne opakowanie, np. dla plików zip, które również używają formatu deflate. Komentarz na temat prędkości jest prawie na pewno fałszywy. Sprawdzanie integralności w przypadku gzuncompress() zajmuje bardzo mało czasu w porównaniu do dekompresji. Powinieneś zrobić własne testy.

Z tego jednego przykładu mogę się nadgeneralizować, ale powiedziałbym, że należy całkowicie zignorować komentarze w dokumentacji PHP. Są hojni, niedoinformowani.

Nawiasem mówiąc, funkcje te są nazwane w strasznie mylący sposób. Tylko gzencode powinien mieć w nazwie nazwę "gz", ponieważ jest to jedyny z tych, które są w rzeczywistości obsługiwane w formacie .gz. gzcompress brzmi jak skompresowany do formatu gzip, ale w rzeczywistości kompresuje się do formatu zlib.

+0

Dziękuję za odpowiedź. To mi bardzo pomaga. Proszę również rozważyć umieszczenie swojej odpowiedzi na dokumentacji php.net. – Alasdair