2009-03-07 5 views
51

J'ai une grande quantité de données à déplacer en utilisant deux scripts PHP: un sur le côté client en utilisant un script PHP en ligne de commande et d'autres derrière Apache. Je POSTE les données du côté serveur et utilise le flux d'entrée php: // pour l'enregistrer sur le serveur web. Pour éviter d'atteindre des limites de mémoire, les données sont séparées en blocs de 500 Ko pour chaque requête POST. Tout cela fonctionne bien.Quelle méthode de compression utiliser en PHP?

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

Quelle paire de fonctions recommanderiez-vous et pourquoi?

MISE À JOUR: Je viens de lire FAQ zlib:

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

+1

'gzdecode()' ne semble pas encore être disponible en php, alors évitez-le. –

+1

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

Répondre

62

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 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 l'algorithme DEFLATE brut seul, qui est la base pour les 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 est inutilisé lors de la compression d'une chaîne). gzencode() et gzcompress() ajoutent toutes 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 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 recommanderais gzencode() (format GZIP) qui est probablement mieux supporté que gzcompress() (format ZLIB) parmi d'autres outils.

+3

Presque correct. J'ai étudié un peu, et il semble que gzencode ne contient aucune donnée d'en-tête - il a juste des données d'en-tête différentes. –

+2

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

4

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

39

Je ne suis pas un expert PHP 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 fournies. DEFLATE est le nom de l'algorithme de compression 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.

L'algorithme "GZIP" n'existe pas. GZIP utilise l'algorithme DEFLATE et place les données de cadrage autour des données compressées. Avec GZIP vous pouvez ajouter des choses comme le nom de fichier, l'heure du fichier, un CRC, même un commentaire. Cette métadonnée est facultative, cependant, et de nombreux gzippers l'omettent.

ZLIB est similaire, sauf avec un ensemble différent et plus limité de métadonnées et un en-tête de 2 octets spécifique. Tout est dans les RFC de l'IETF 1950, 1951 et 1952. Dire que "l'algorithme gzip se compresse mieux que DEFLATE" est tout simplement un non-sens.

Il n'y a pas d'algorithme gzip. Et l'algorithme utilisé dans le format GZIP est DEFLATE.

+0

Merci d'avoir clarifié la situation. Avant de lire cela, rien d'autre n'avait de sens ... – rvighne

Questions connexes