2013-02-22 17 views
7

Nel manuale PHP c'è un commento su gzdeflate dicendo:PHP: gzdeflate è sicuro su più macchine?

gzcompress produce dati più lunghi perché incorpora le informazioni relative la codifica sulla corda. Se si stanno comprimendo dati che saranno gestiti solo su una macchina, non è necessario preoccuparsi di su quale di queste funzioni si utilizza. Tuttavia, se si passano dati compressi con queste funzioni su un altro computer, è necessario utilizzare gzcompress per utilizzare .

e poi

esecuzione 50000 ripetizioni vari contenuti, ho trovato che gzdeflate() e gzcompress() sia eseguita ugualmente veloci indipendentemente contenuti e livello di compressione, ma gzinflate() sempre era circa due volte più veloce di gzuncompress().

Per il mio scopo, sto archiviando i dati su una macchina per un utilizzo futuro. I dati vengono letti spesso, ma scritti solo una volta. In teoria, un giorno verrà spostato su un'altra macchina, se cambio server a un certo punto, ma sono passati alcuni anni.

È sicuro per me utilizzare gzdeflate e gzinflate anziché gzcompress e gzuncompress?

Il mio modo di pensare è il seguente: gzinflate è più veloce e questo aiuterà molto il server poiché ci saranno molte richieste di lettura. Se a un certo punto del futuro non riesco a leggere il file, dovrei essere in grado di capire come decomprimere il file e ricomprimerlo, giusto? Non è che il gzinflate semplicemente non funzionerà magicamente un giorno, come sembra dire il primo commento. Anche senza un header da 6 byte sono sicuro che sarà in qualche modo espandibile.

Pensieri?

UPDATE - Indice di riferimento

10.000 iterazioni ciascuno:

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 

risposta

9

Il commento è una sciocchezza. È possibile utilizzare uno qualsiasi di gzcompress, gzdeflate o gzencode per produrre dati compressi che possono essere decompressi in modo mobile ovunque. Queste funzioni differiscono solo nell'involucro attorno ai dati di deflazione (RFC 1951). gzcompress ha un wrapper zlib (RFC 1950), gzdeflate non ha wrapper e gzencode ha un wrapper gzip (RFC 1952).

Io suggerirei non utilizzando gzdeflate, poiché nessun involucro significa nessun controllo di integrità. gzdeflate deve essere utilizzato solo quando viene generato un altro wrapper al di fuori di quello, ad es. per i file zip, che utilizzano anche il formato deflate. Il commento sulla velocità è quasi certamente falso. Il controllo di integrità di gzuncompress() richiede pochissimo tempo rispetto alla decompressione. Dovresti fare i tuoi test.

Da questo esempio potrei essere troppo generico, ma direi che è necessario ignorare completamente i commenti nella documentazione di PHP. Sono, per essere generosi, disinformati.

A proposito, queste funzioni sono denominate in modo orribilmente confuso. Solo gzencode dovrebbe avere "gz" nel nome, poiché questo è l'unico di quelli che effettivamente si occupa nel formato .gz. gzcompress sembra comprimere nel formato gzip, ma in realtà viene compresso nel formato zlib.

+0

Grazie per la risposta. Questo mi aiuta molto. Si prega inoltre di postare la risposta sulla documentazione di php.net. – Alasdair

Problemi correlati