Domanda

Ho una grande quantità di dati da spostare usando due script PHP: uno sul lato client usando uno script PHP a riga di comando e altri dietro Apache. POSTO i dati sul lato server e utilizzo php: // flusso di input per salvarli sul server web. Per evitare di raggiungere limiti di memoria, i dati vengono separati in blocchi da 500 kB per ogni richiesta POST. Tutto questo funziona bene.

Ora, per salvare la larghezza di banda e velocizzarla, voglio comprimere i dati prima di inviarli e decomprimerli quando ricevuti dall'altra parte. Ho trovato 3 coppie di funzioni che possono svolgere il lavoro, ma non riesco a decidere quale utilizzare:

Quale coppia di funzioni consiglieresti e perché?

AGGIORNAMENTO: ho appena letto le FAQ di zlib:

Il formato gzip ( gzencode ) è stato progettato per conservare le informazioni della directory su un singolo file, come il nome e la data dell'ultima modifica. Il formato zlib ( gzcompress ) invece è stato progettato per applicazioni in-memory e di canali di comunicazione, ha un'intestazione e un trailer molto più compatti e utilizza un controllo di integrità più veloce di gzip.

È stato utile?

Soluzione

Tutti questi possono essere usati. Ci sono sottili differenze tra i tre:

  • gzencode () utilizza il file GZIP formato, lo stesso dello strumento da riga di comando gzip . Questo formato di file ha un'intestazione contenente metadati opzionali, dati compressi DEFLATE e un piè di pagina contenente un checksum CRC32 e un controllo di lunghezza.
  • gzcompress () utilizza il formato ZLIB . Ha un'intestazione più corta che serve solo per identificare il formato di compressione, DEFLATE i dati compressi e un piè di pagina contenente un checksum ADLER32.
  • gzdeflate () utilizza il DEFLATE grezzo algoritmo da solo, che è la base per entrambi gli altri formati.

Tutti e tre usano lo stesso algoritmo sotto il cofano. gzencode () aggiunge la possibilità di includere il nome del file originale e altri dati ambientali (questo non viene utilizzato quando si comprime solo una stringa). gzencode () e gzcompress () aggiungono entrambi un checksum, quindi è possibile verificare l'integrità dell'archivio, che può essere utile su metodi di trasmissione e archiviazione non affidabili. Se tutto è archiviato localmente e non hai bisogno di metadati aggiuntivi, gzdeflate () sarebbe sufficiente. Per la portabilità raccomanderei gzencode () (formato GZIP) che è probabilmente meglio supportato rispetto a gzcompress () (formato ZLIB) tra gli altri strumenti.

Quando si comprimono stringhe molto brevi, l'overhead di ciascun metodo diventa rilevante poiché per un input molto breve l'overhead può comprendere una parte significativa dell'output. Il sovraccarico per ciascun metodo, misurato comprimendo una stringa vuota, è:

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

Altri suggerimenti

Non sono un esperto di PHP e non posso rispondere alla domanda posta, ma sembra che ci siano molte ipotesi in corso qui e che vengano fornite informazioni confuse.

DEFLATE è il nome dell'algoritmo di compressione utilizzato da ZLIB, GZIP e altri. In teoria, GZIP supporta algoritmi di compressione alternativi, ma in pratica non ce ne sono.

Non esiste qualcosa come "l'algoritmo GZIP". GZIP utilizza l'algoritmo DEFLATE e inserisce i dati di framing attorno ai dati compressi. Con GZIP puoi aggiungere cose come il nome del file, l'ora del file, un CRC e persino un commento. Questi metadati sono facoltativi, tuttavia, e molti gzipper lo omettono.

ZLIB è simile, ad eccezione di un set di metadati diverso e più limitato e di un'intestazione a 2 byte specifica.

Questo è tutto negli RFC IETF 1950 , 1951 e 1952 .

Dire che "l'algoritmo gzip si comprime meglio di DEFLATE" è solo una sciocchezza. Non esiste un algoritmo gzip. E l'algoritmo utilizzato nel formato GZIP è DEFLATE .

Tutti i metodi sono essenzialmente gli stessi, la differenza tra loro è principalmente nelle intestazioni. personalmente userei gzencode, questo produrrà un output che è uguale a una chiamata a riga di comando all'utility gzip.

Ho dovuto decomprimere un file compresso gzip in PHP con C ++. Ho scoperto che il PHP gzencode e la sua controparte gzdecode usano il metodo Z_NO_FLUSH e alla fine del blocco dei dati per codificare / decodificare , applica Z_FINISH . L'esempio / tutorial in C mostrato sul sito Web zlib può essere usato per decomprimere e comprimere i file gziped da PHP, purché il bit di Windows e il livello di memoria siano cambiati per consentire deflazioni e inflazioni gzip.

Extra: sembra che la maggior parte delle persone in questo thread non abbia idea di quale sia il "metodo di compressione" significava.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top