Question

J'ai une grande quantité de données à déplacer à l'aide de deux scripts PHP: un côté client utilisant un script PHP en ligne de commande et un autre derrière Apache. Je publie les données côté serveur et utilise php: // flux d’entrée pour les sauvegarder sur le serveur Web. Pour éviter d'atteindre les limites de mémoire, les données sont séparées en tranches de 500 Ko pour chaque demande 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 pouvant faire le travail, mais je ne peux pas choisir laquelle utiliser:

Quelle paire de fonctions recommanderiez-vous et pourquoi?

UPDATE: je viens de lire la FAQ zlib:

Le format gzip ( gzencode ) a été conçu pour conserver les informations du répertoire relatives à un seul fichier, telles que le nom et la date de la dernière modification. Le format zlib ( gzcompress ), d’autre part, a été conçu pour les applications en mémoire et sur les canaux de communication. Il présente un en-tête et un suiveur beaucoup plus compacts.

Était-ce utile?

La solution

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

  • gzencode () utilise le fichier GZIP format identique à l’outil de ligne de commande gzip . 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 un contrôle 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 le fichier DEFLATE brut algorithme seul, qui constitue 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 (inutilisées lors de la compression d'une chaîne). gzencode () et gzcompress () ajoutent tous les deux une somme de contrôle, de sorte que l'intégrité de l'archive puisse être vérifiée, ce qui peut être utile avec 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, 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, le temps système de chaque méthode devient pertinent car, pour une entrée très courte, le temps système peut représenter une partie importante de la sortie. Le temps système pour chaque méthode, mesuré en compressant une chaîne vide, est le suivant:

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

Autres conseils

Je ne suis pas un expert en PHP et je ne peux pas répondre à la question posée, mais il semble que beaucoup de suppositions se passent ici et que des informations floues soient présentées.

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

Il n’existe pas de "algorithme GZIP". GZIP utilise l'algorithme DEFLATE et place les données d'encadrement autour des données compressées. Avec GZIP, vous pouvez ajouter des éléments tels que le nom de fichier, l’heure du fichier, un CRC, voire un commentaire. Ces métadonnées sont facultatives, cependant, et beaucoup de gzippers les omettent simplement.

ZLIB est similaire, à l'exception d'un ensemble de métadonnées différent, plus limité, et d'un en-tête spécifique à 2 octets.

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

Pour dire que "l'algorithme gzip compresse mieux que DEFLATE" est juste un non-sens. Il n'y a pas d'algorithme gzip. Et l'algorithme utilisé dans le format GZIP est DEFLATE .

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 produirait une sortie égale à une invocation de ligne de commande à l'utilitaire gzip.

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

Extra: il semble que la plupart des utilisateurs de ce fil n’ignorent pas ce que "Méthode de compression" signifiait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top