Filtres de compression

Alors que les gestionnaires de compression fournissent un moyen pour g�n�rer des fichiers aux formats gzip et bz2, ils ne permettent pas de g�rer les protocoles r�seaux compress�s, ni de commencer avec un flux non compress� pour le transformer en flux compress�. Pour faire cela, il faut appliquer un filtre de compression.

Note: Les filtres de compression ne g�n�rent pas les en-t�tes et fins de fichiers, comme le fait l'utilitaire gzip. Ils ne font que compresser et d�compresser des portions de flux de donn�es.

zlib.deflate (compression) et zlib.inflate (decompression) 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 la biblioth�que zlib : actuellement, c'est 6. window est la taille du buffer 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. 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 non pas le co�t global.

Note: Comme le niveau de compression est le param�tre le plus courant, il peut aussi �tre fourni en passant un entier comme param�tre, au lieu d'un tableau.

Les filtres de compression zlib.* sont disponibles avec PHP depuis la version 5.1.0 si le support zlib est activ�. Ils sont �galement disponibles pour les versions 5.0.x en installant le paquet » zlib_filter depuis » PECL. Ces filtres ne sont pas disponibles en PHP 4.

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 simple zlib.deflate

<?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_WRITE6);
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 fonctionnent de la m�me mani�re que les filtres zlib. Le filtre bzip2.compress accepte jusqu'� 2 param�tres, sous la forme d'un tableau associatif : blocks est une valeur enti�re, 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'efforts fournis 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 associ� � l'index small . small , lorsqu'il vaut TRUE, indique � la biblioth�que bzip qu'elle doit faire une d�compression en utilisant le moins de m�moire possible, aux d�pends de la vitesse.

Les filtres bzip2.* ne sont pas inclus dans la distribution PHP depuis la version 5.1.0 si le support bz2 est activ�. Ils sont �galement disponibles pour les versions 5.0.x de PHP en installant le paquet » bz2_filter depuis » PECL. Ces filtres ne sont pas disponibles pour PHP 4.

Exemple #3 bzip2.compress et bzip2.decompress

<?php
$param 
= array('blocks' => 9'work' => 0);

echo 
"Le texte original est long de " strlen(LICENSE) . " octets.\n";

$fp fopen('LICENSE.compressed''w');
stream_filter_append($fp'bzip2.compress'STREAM_FILTER_WRITE$param);
fwrite($fpfile_get_contents('LICENSE'));
fclose($fp);

echo 
"Le fichier compress� fait " filesize('LICENSE.compressed') . " octets de long.\n";

/* Affiche :

Le texte original est long de 3288 octets.
Le fichier compress� fait 1488 octets de long.

 */
?>