73 votes

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 utilisant une ligne de commande scripts PHP et l'autre derrière Apache. Je POSTE les données du côté du serveur et j'utilise php://input stream pour les sauvegarder du côté du serveur web. Pour éviter d'atteindre les limites de mémoire, les données sont séparées en morceaux de 500kB pour chaque requête POST. Tout cela fonctionne bien.

Maintenant, pour économiser la bande passante et l'accélérer, je veux compresser les données avant de les envoyer et les décompresser lorsqu'elles sont reçues à l'autre bout. 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 ?

UPDATE : Je viens de lire la FAQ de zlib :

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

1 votes

gzdecode() ne semble pas encore être disponible en php, donc à éviter.

1 votes

gzdecode() est défini uniquement pour PHP 5.4.0 ou plus récent : php.net/manual/fr/function.gzdecode.php

100voto

thomasrutter Points 42905

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

  • gzencode() utilise le format de fichier GZIP, le même que celui de l'application gzip outil en ligne de commande. Ce format de fichier comporte 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 la longueur.
  • gzcompress() utilise le format ZLIB. Il possède 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 seul l'algorithme DEFLATE brut, qui est la base des deux autres formats.

Tous trois utilisent le même algorithme sous le capot, de sorte qu'ils ne diffèrent pas en termes de vitesse ou d'efficacité. gzencode() ajoute la possibilité d'inclure le nom du fichier d'origine et d'autres données environnementales (ceci est inutilisé lorsque vous comprimez simplement une chaîne). gzencode() et gzcompress() Les deux ajoutent une somme de contrôle, de sorte que l'intégrité de l'archive peut être vérifiée, ce qui peut être utile sur des 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, alors gzdeflate() suffirait. Pour la portabilité, je recommande gzencode() (format GZIP) qui est probablement mieux supporté que gzcompress() (format ZLIB) parmi d'autres outils.

Lors de la compression de chaînes de caractères très courtes, l'overhead de chaque méthode devient pertinent, car pour des entrées très courtes, l'overhead peut représenter une part importante du résultat. L'overhead de chaque méthode, mesuré en compressant une chaîne vide, est le suivant :

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

3 votes

Presque correct. J'ai enquêté un peu, et il semble que gzencode n'est pas dépourvu de données d'en-tête - il a juste des données d'en-tête différentes.

3 votes

@Milan Je suppose que vous vouliez dire "gzcompress n'est pas sans aucune donnée d'en-tête - il a juste des données d'en-tête différentes".

49voto

Cheeso Points 87022

Je ne suis pas un expert en PHP et je ne peux pas répondre à la question posée, mais il semble qu'il y ait beaucoup de suppositions et d'informations floues.

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

Il n'existe pas de "l'algorithme GZIP". GZIP utilise l'algorithme DEFLATE, et met des données d'encadrement autour des données compressées. Avec GZIP, vous pouvez ajouter des choses comme le nom du fichier, l'heure du fichier, un CRC, voire un commentaire. Ces métadonnées sont toutefois facultatives, et de nombreux gzippers les omettent tout simplement.

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

Tout cela se trouve dans les RFC de l'IETF. 1950 , 1951 y 1952 .

Dire que "l'algorithme gzip compresse mieux que DEFLATE" est tout simplement absurde. Il n'y a pas d'algorithme gzip. Et l'algorithme utilisé dans le format GZIP est DEFLATE .

7voto

Jan Jungnickel Points 1486

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

0voto

AKJ Points 576

J'ai dû décompresser un fichier compressé par gzip en PHP avec C++. J'ai découvert que le programme PHP gzencode et son homologue gzdecode utiliser le Z_NO_FLUSH et à la fin du bloc des données à coder/décoder, applique Z_FINISH . L'exemple/tutoriel en C présenté sur le site de zlib peut être utilisé pour décompresser et compresser des fichiers gzipés depuis PHP, à condition que le bit Windows et le niveau de mémoire soient modifiés pour permettre les déflations et inflations gzip.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X