zlib.deflate et zlib.inflate
zlib.deflate (compression) et
zlib.inflate (décompression) sont les implémentations
des méthodes de compression présentées dans la
» RFC 1951.
Le filtre deflate prend jusqu'à trois paramètres, passés
sous la forme de tableau associatif.
level spécifie le niveau de compression souhaité,
de 1 à 9. Plus le niveau est haut, meilleure est la compression, et plus
cher est le coût de compression. Deux niveaux de compression spéciaux
existent : 0, qui représente l'absence de compression, et -1, qui
représente le niveau par défaut de zlib : actuellement, 6.
window est la taille du tampon mémoire, en base 2.
Les valeurs supérieures, jusqu'à 15, soit 32768 octets, donnent de meilleures
compressions, et les valeurs inférieures, jusqu'à 9, soit 512 octets,
occupent le moins d'espace en mémoire. Par défaut,
window vaut actuellement 15.
Le filtre zlib.deflate implémente les méthodes de
compression DEFLATE, ZLIB et
GZIP selon la valeur du paramètre
window.
Les 4 bits de poids faible du paramètre window définissent la taille du
tampon d'historique interne, exprimée comme le logarithme en base 2 de
cette taille, entre 8 et 15. La signification des autres bits est décrite
ci-dessous.
-
DEFLATE (» RFC 1951)
est un algorithme de compression brut, sans en-tête ni somme de contrôle.
Il est utilisé lorsque le paramètre window est compris entre -9 et -15.
Cet algorithme est la base de tous les formats générés par le filtre
zlib.deflate.
Les fonctions qui opèrent directement sur des chaînes sont
gzdeflate() et gzinflate().
-
ZLIB (» RFC 1950)
applique l'algorithme DEFLATE et ajoute un en-tête de
2 octets et un trailer de 4 octets contenant la somme de contrôle Adler32
des données non compressées en ordre big-endian :
ZLIB = ENTETEZLIB(2o) DEFLATE ADLER32(4o)
L'en-tête de 2 octets, lu comme un entier non signé de 16 bits en
big-endian, doit être un multiple de 31.
Ce format est généré lorsque le paramètre window est compris entre 8 et 15.
Les fonctions qui opèrent directement sur des chaînes sont
gzcompress() et gzuncompress().
-
GZIP (» RFC 1952)
applique l'algorithme DEFLATE en ajoutant un en-tête et
un trailer contenant la somme de contrôle CRC32 des
données non compressées et leur longueur, tous deux en ordre little-endian :
GZIP = ENTETEGZIP(10o) DEFLATE CRC32(4o) LONGUEUR(4o)
C'est le format des fichiers .gz.
Ce format est généré lorsque le paramètre window est compris entre
9+16=25 et 15+16=31. La longueur des données non compressées est limitée
à 4 Go ; au-delà, seul le modulo 2^32 de la longueur réelle est stocké
dans la partie LONGUEUR.
Les fonctions qui opèrent directement sur des chaînes sont
gzencode() et gzdecode() ;
la fonction gzopen() permet de lire et d'écrire des
fichiers .gz.
Avec le filtre
zlib.inflate, seul le paramètre
window est pris en compte ; tout autre paramètre
(
memory,
level) est ignoré.
En notant $W le logarithme en base 2 de la taille du tampon d'historique,
de sorte que 2^$W octets sont alloués par le décompresseur. Pour le format
ZLIB, cette valeur doit être supérieure ou égale à celle enregistrée dans
l'en-tête, vérifiée à la décompression ; pour les autres formats, elle doit
simplement être suffisamment grande pour les distances de correspondance
présentes dans les données.
La plage est 9 ≤ $W ≤ 15. En cas de doute, $W=15 est le choix le plus sûr.
-
DEFLATE (» RFC 1951) :
utiliser window=-$W, avec $W au moins égal à la valeur utilisée à la
compression. En cas de doute, utiliser window=-15.
-
ZLIB (» RFC 1950) :
utiliser window=$W. La valeur de $W est disponible dans l'en-tête ZLIB,
sinon utiliser window=15.
-
GZIP (» RFC 1952) :
utiliser window=$W+16. Un en-tête GZIP ne contient pas la taille de
fenêtre, donc utiliser window=31 sauf si la valeur utilisée à la
compression est connue.
-
ZLIB ou GZIP :
utiliser window=$W+32 pour la détection automatique de l'en-tête, de
sorte que les deux formats puissent être reconnus et décompressés ;
window=15+32=47 est le choix le plus sûr.
memory est une indication du niveau de mémoire
nécessaire.
Les valeurs valides vont de 1, pour l'allocation minimale, à 9, pour une
allocation maximale. L'allocation de mémoire affecte la vitesse d'exécution,
et n'a pas d'impact sur la taille de la charge utile générée.
Note:
Comme le niveau de compression est le paramètre le plus courant, il peut
aussi être fourni en tant que valeur entier, au lieu d'un tableau.
Les filtres de compression zlib.* sont disponibles si le support de
zlib est activé.
Exemple #1
zlib.deflate et
zlib.inflate
<?php
$params = array('level' => 6, 'window' => 15, 'memory' => 9);
$original_text = "This is a test.\nThis is only a test.\nThis is not an important string.\n";
echo "Le texte original est long de " . strlen($original_text) . " octets.\n";
$fp = fopen('test.deflated', 'w');
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, $params);
fwrite($fp, $original_text);
fclose($fp);
echo "Le fichier compressé fait " . filesize('test.deflated') . " octets de long.\n";
echo "Le texte original était :\n";
/* Utilise readfile et zlib.inflate pour décompresser à la volée */
readfile('php://filter/zlib.inflate/resource=test.deflated');
/* Affiche :
Le texte original est long de 70 octets
Le fichier compressé fait 56 octets de long.
Le texte original était :
This is a test.
This is only a test.
This is not an important string.
*/
?>
Exemple #2
zlib.deflate simple
<?php
$original_text = "This is a test.\nThis is only a test.\nThis is not an important string.\n";
echo "Le texte original est long de " . strlen($original_text) . " octets.\n";
$fp = fopen('test.deflated', 'w');
/* Ici, "6" indique le niveau de compression de 6 */
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, 6);
fwrite($fp, $original_text);
fclose($fp);
echo "Le fichier compressé fait " . filesize('test.deflated') . " octets de long.\n";
/* Affiche :
Le texte original est long de 70 octets
Le fichier compressé fait 56 octets de long.
*/
?>
bzip2.compress et bzip2.decompress
bzip2.compress et
bzip2.decompress
fonctionnent de la même manière que les filtres zlib décrits ci-dessus.
Le filtre bzip2.compress accepte jusqu'à 2 paramètres,
sous la forme d'un tableau associatif :
blocks est une valeur entier, de 1 à 9,
spécifiant le nombre de blocs de 100 kb de mémoire à allouer à l'espace de
travail.
work est aussi un entier dont la valeur va de
0 à 250, et qui indique le niveau d'effort fourni avec une méthode de
compression avant de passer à une autre méthode, plus lente. Modifier ce
paramètre n'a qu'un effet sur la vitesse de compression. Le gain d'espace
ou la mémoire utilisée restent les mêmes. Un niveau de 0 indique que la
bibliothèque doit utiliser sa configuration par défaut.
Le filtre bzip2.decompress accepte uniquement un paramètre,
qui peut être passé sous la forme d'un booléen, ou en tant que l'élément
small d'un tableau associatif.
small, lorsque défini à true, indique à la
bibliothèque bzip qu'elle doit faire une décompression en utilisant le
moins de mémoire possible, aux dépens de la vitesse.
Les filtres bzip2.* sont disponibles si le support de
bz2 est activé.
Exemple #3
bzip2.compress et
bzip2.decompress
<?php
$param = array('blocks' => 9, 'work' => 0);
echo "Le fichier original fait " . filesize('LICENSE') . " octets de long.\n";
$fp = fopen('LICENSE.compressed', 'w');
stream_filter_append($fp, 'bzip2.compress', STREAM_FILTER_WRITE, $param);
fwrite($fp, file_get_contents('LICENSE'));
fclose($fp);
echo "Le fichier compressé fait " . filesize('LICENSE.compressed') . " octets de long.\n";
/* Affiche :
Le fichier original fait 3288 octets de long.
Le fichier compressé fait 1488 octets de long.
*/
?>