web-dev-qa-db-fra.com

Quelle méthode de compression utiliser en PHP?

J'ai une grande quantité de données à déplacer en utilisant deux scripts PHP: un côté client en utilisant une ligne de commande PHP et d'autres derrière Apache. I = POST les données côté serveur et utilisez le flux d'entrée php: // pour les enregistrer du côté du serveur Web. Pour éviter d'atteindre des limites de mémoire, les données sont séparées en morceaux de 500 Ko pour chaque = POST demande. Tout cela fonctionne bien.

Maintenant, pour économiser la bande passante et l'accélérer, je veux compresser les données avant d'envoyer et décompresser lorsqu'elles sont reçues à l'autre extrémité. J'ai trouvé 3 paires de fonctions qui peuvent faire le travail, mais je ne peux pas décider laquelle utiliser:

Quelle paire de fonctions recommanderiez-vous et pourquoi?

MISE À JOUR: Je viens de lire la FAQ zlib:

Le format gzip (gzencode) a été conçu pour conserver les informations de répertoire sur un seul fichier, telles que le nom et la date de dernière modification. Le format zlib (gzcompress), d'autre part, a été conçu pour les applications de canaux de mémoire et de communication, et possède un en-tête et une remorque beaucoup plus compacts et utilise un contrôle d'intégrité plus rapide que gzip.

61
Milan Babuškov

Tous ces éléments peuvent être utilisés. Il existe de subtiles différences entre les trois:

  • gzencode () utilise le format de fichier GZIP, le même que l'outil de ligne de commande gzip. Ce format de fichier a un en-tête contenant des métadonnées facultatives, des données compressées DEFLATE et un pied de page contenant une somme de contrôle CRC32 et une vérification de longueur.
  • gzcompress () utilise le format ZLIB. Il a un en-tête plus court servant uniquement à identifier le format de compression, les données compressées DEFLATE et un pied de page contenant une somme de contrôle ADLER32.
  • gzdeflate () utilise lui-même l'algorithme DEFLATE brut, qui est la base des deux autres formats.

Tous les trois utilisent le même algorithme sous le capot. gzencode() ajoute la possibilité d'inclure le nom de fichier d'origine et d'autres données environnementales (ceci n'est pas utilisé lors de la compression d'une chaîne). gzencode() et gzcompress() ajoutent tous deux une somme de contrôle, de sorte que l'intégrité de l'archive peut être vérifiée, ce qui peut être utile par rapport aux méthodes de transmission et de stockage peu fiables. Si tout est stocké localement et que vous n'avez pas besoin de métadonnées supplémentaires, gzdeflate() suffira. Pour la portabilité, je recommanderais gzencode() (format GZIP) qui est probablement mieux pris en charge que gzcompress() (format ZLIB) entre autres outils.

Lors de la compression de chaînes très courtes, la surcharge de chaque méthode devient pertinente car pour une entrée très courte, la surcharge peut comprendre une partie importante de la sortie. La surcharge pour chaque méthode, mesurée en compressant une chaîne vide, est:

  • gzencode('') = 20 octets
  • gzcompress('') = 8 octets
  • gzdeflate('') = 2 octets
80
thomasrutter

Je ne suis pas PHP expert et je ne peux pas répondre à la question posée, mais il semble qu'il y ait beaucoup de devinettes ici et que des informations floues soient proposées.

DEFLATE est le nom de l'algorithme de compression utilisé par ZLIB, GZIP et autres. En théorie, GZIP prend en charge des algorithmes de compression alternatifs, mais en pratique, il n'y en a pas.

Il n'y a rien de tel que "l'algorithme GZIP". GZIP utilise l'algorithme DEFLATE et place les données de cadrage autour des données compressées. Avec GZIP, vous pouvez ajouter des éléments comme le nom de fichier, l'heure du fichier, un CRC, voire un commentaire. Ces métadonnées sont facultatives, cependant, et de nombreux gzippers l'omet simplement.

ZLIB est similaire, sauf avec un ensemble de métadonnées différent et plus limité et un en-tête spécifique de 2 octets.

Tout cela est dans les RFC IETF 195 , 1951 et 1952 .

Dire que "l'algorithme gzip compresse mieux que DEFLATE" est un non-sens. Il n'y a pas d'algorithme gzip. Et l'algorithme utilisé au format GZIP est DEFLATE .

43
Cheeso

Toutes les méthodes sont essentiellement les mêmes, la différence entre elles réside principalement dans les en-têtes. personnellement, j'utiliserais gzencode, cela produira une sortie qui est égale à une invocation de ligne de commande vers l'utilitaire gzip.

6
Jan Jungnickel

J'ai dû décompresser un fichier compressé gzip en PHP avec C++. J'ai découvert que le PHP gzencode et son équivalent gzdecode Utilisez le Z_NO_FLUSH méthode et à la fin du bloc des données à encoder/décoder, applique Z_FINISH. L'exemple/tutoriel en C montré sur le site Web zlib peut être utilisé pour décompresser et compresser des fichiers gziped à partir de PHP, tant que le bit Windows et le niveau de mémoire sont modifiés pour permettre les déflations et les gonflements gzip.

Extra: Il semble que la plupart des gens de ce fil n'aient aucune idée de ce que signifie "méthode de compression".

0
AKJ