<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/filters.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'filters.compression.php',
    1 => 'Filtres de compression',
    2 => 'Filtres de compression',
  ),
  'up' => 
  array (
    0 => 'filters.php',
    1 => 'Liste des filtres disponibles',
  ),
  'prev' => 
  array (
    0 => 'filters.convert.php',
    1 => 'Filtres de conversion',
  ),
  'next' => 
  array (
    0 => 'filters.encryption.php',
    1 => 'Filtres de chiffrement',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'appendices/filters.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="filters.compression" class="section">
  <h2 class="title">Filtres de compression</h2>

  <p class="simpara">
   Alors que les <a href="wrappers.compression.php" class="link">enveloppes de
   compression</a>  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 cela, un filtre de compression peut être appliqué
   à tout moment sur n&#039;importe quelle ressource de flux.
  </p>

  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="simpara">
    Les filtres de compression <em>ne génèrent pas</em> les en-têtes
    et fins de fichiers, comme le fait l&#039;utilitaire <code class="literal">gzip</code>.
    Ils ne font que compresser et décompresser des portions de flux de données.
   </p>
  </p></blockquote>

  <div class="section" id="filters.compression.zlib">
   <h2 class="title">zlib.deflate et zlib.inflate</h2>
   <p class="para">
    <code class="literal">zlib.deflate</code> (compression) et
    <code class="literal">zlib.inflate</code> (décompression) sont les implémentations
    des méthodes de compression présentées dans la
    <a href="https://datatracker.ietf.org/doc/html/rfc1951" class="link external">&raquo;&nbsp;RFC 1951</a>.
    Le filtre <code class="literal">deflate</code> prend jusqu&#039;à trois paramètres, passés
    sous la forme de <a href="language.types.array.php" class="link">tableau</a> associatif.

    <code class="parameter">level</code> 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&#039;absence de compression, et -1, qui
    représente le niveau par défaut de zlib : actuellement, 6.

    <code class="parameter">window</code> est la taille du tampon mémoire, en base 2.
    Les valeurs supérieures, jusqu&#039;à 15, soit 32768 octets, donnent de meilleures
    compressions, et les valeurs inférieures, jusqu&#039;à 9, soit 512 octets,
    occupent le moins d&#039;espace en mémoire. Par défaut,
    <code class="parameter">window</code> vaut actuellement <code class="literal">15</code>.

    Le filtre <code class="literal">zlib.deflate</code> implémente les méthodes de
    compression <code class="literal">DEFLATE</code>, <code class="literal">ZLIB</code> et
    <code class="literal">GZIP</code> selon la valeur du paramètre
    <code class="parameter">window</code>.

    Les 4 bits de poids faible du paramètre window définissent la taille du
    tampon d&#039;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.

    <ul class="itemizedlist">
     <li class="listitem">
      <p class="simpara">
       <code class="literal">DEFLATE</code> (<a href="https://datatracker.ietf.org/doc/html/rfc1951" class="link external">&raquo;&nbsp;RFC 1951</a>)
       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
       <code class="literal">zlib.deflate</code>.
       Les fonctions qui opèrent directement sur des chaînes sont
       <span class="function"><a href="function.gzdeflate.php" class="function">gzdeflate()</a></span> et <span class="function"><a href="function.gzinflate.php" class="function">gzinflate()</a></span>.
      </p>
     </li>

     <li class="listitem">
      <p class="simpara">
       <code class="literal">ZLIB</code> (<a href="https://datatracker.ietf.org/doc/html/rfc1950" class="link external">&raquo;&nbsp;RFC 1950</a>)
       applique l&#039;algorithme <code class="literal">DEFLATE</code> 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 :
       <code class="literal"><div class="cdata"><pre>ZLIB = ENTETEZLIB(2o) DEFLATE ADLER32(4o)</pre></div></code>

       L&#039;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
       <span class="function"><a href="function.gzcompress.php" class="function">gzcompress()</a></span> et <span class="function"><a href="function.gzuncompress.php" class="function">gzuncompress()</a></span>.
      </p>
     </li>

     <li class="listitem">
      <p class="simpara">
       <code class="literal">GZIP</code> (<a href="https://datatracker.ietf.org/doc/html/rfc1952" class="link external">&raquo;&nbsp;RFC 1952</a>)
       applique l&#039;algorithme <code class="literal">DEFLATE</code> en ajoutant un en-tête et
       un trailer contenant la somme de contrôle <code class="literal">CRC32</code> des
       données non compressées et leur longueur, tous deux en ordre little-endian :
       <code class="literal"><div class="cdata"><pre>GZIP = ENTETEGZIP(10o) DEFLATE CRC32(4o) LONGUEUR(4o)</pre></div></code>

       C&#039;est le format des fichiers <code class="literal">.gz</code>.
       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 <code class="literal">LONGUEUR</code>.
       Les fonctions qui opèrent directement sur des chaînes sont
       <span class="function"><a href="function.gzencode.php" class="function">gzencode()</a></span> et <span class="function"><a href="function.gzdecode.php" class="function">gzdecode()</a></span> ;
       la fonction <span class="function"><a href="function.gzopen.php" class="function">gzopen()</a></span> permet de lire et d&#039;écrire des
       fichiers <code class="literal">.gz</code>.
      </p>
     </li>
    </ul>

    Avec le filtre <code class="literal">zlib.inflate</code>, seul le paramètre
    <code class="parameter">window</code> est pris en compte ; tout autre paramètre
    (<code class="parameter">memory</code>, <code class="parameter">level</code>) est ignoré.
    En notant $W le logarithme en base 2 de la taille du tampon d&#039;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&#039;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.

    <ul class="itemizedlist">
     <li class="listitem">
      <p class="simpara">
       <code class="literal">DEFLATE</code> (<a href="https://datatracker.ietf.org/doc/html/rfc1951" class="link external">&raquo;&nbsp;RFC 1951</a>) :
        utiliser window=-$W, avec $W au moins égal à la valeur utilisée à la
        compression. En cas de doute, utiliser window=-15.
      </p>
     </li>

     <li class="listitem">
      <p class="simpara">
       <code class="literal">ZLIB</code> (<a href="https://datatracker.ietf.org/doc/html/rfc1950" class="link external">&raquo;&nbsp;RFC 1950</a>) :
        utiliser window=$W. La valeur de $W est disponible dans l&#039;en-tête ZLIB,
        sinon utiliser window=15.
      </p>
     </li>

     <li class="listitem">
      <p class="simpara">
       <code class="literal">GZIP</code> (<a href="https://datatracker.ietf.org/doc/html/rfc1952" class="link external">&raquo;&nbsp;RFC 1952</a>) :
       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.
      </p>
     </li>

     <li class="listitem">
      <p class="simpara">
       <code class="literal">ZLIB ou GZIP</code> :
       utiliser window=$W+32 pour la détection automatique de l&#039;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.
      </p>
     </li>
    </ul>

    <code class="parameter">memory</code> est une indication du niveau de mémoire
    nécessaire.
    Les valeurs valides vont de 1, pour l&#039;allocation minimale, à 9, pour une
    allocation maximale. L&#039;allocation de mémoire affecte la vitesse d&#039;exécution,
    et n&#039;a pas d&#039;impact sur la taille de la charge utile générée.
   </p>

   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <p class="simpara">
     Comme le niveau de compression est le paramètre le plus courant, il peut
     aussi être fourni en tant que valeur <a href="language.types.integer.php" class="link">entier</a>, au lieu d&#039;un <a href="language.types.array.php" class="link">tableau</a>.
    </p>
   </p></blockquote>

   <p class="simpara">
    Les filtres de compression zlib.* sont disponibles si le support de
    <a href="ref.zlib.php" class="link">zlib</a> est activé.
   </p>

   <div class="example" id="example-1">
    <p><strong>Exemple #1 
     <code class="literal">zlib.deflate</code> et
     <code class="literal">zlib.inflate</code>
    </strong></p>
    <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
$params </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'level' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">6</span><span style="color: #007700">, </span><span style="color: #DD0000">'window' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">15</span><span style="color: #007700">, </span><span style="color: #DD0000">'memory' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">9</span><span style="color: #007700">);

</span><span style="color: #0000BB">$original_text </span><span style="color: #007700">= </span><span style="color: #DD0000">"This is a test.\nThis is only a test.\nThis is not an important string.\n"</span><span style="color: #007700">;
echo </span><span style="color: #DD0000">"Le texte original est long de " </span><span style="color: #007700">. </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$original_text</span><span style="color: #007700">) . </span><span style="color: #DD0000">" octets.\n"</span><span style="color: #007700">;

</span><span style="color: #0000BB">$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'test.deflated'</span><span style="color: #007700">, </span><span style="color: #DD0000">'w'</span><span style="color: #007700">);
</span><span style="color: #0000BB">stream_filter_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">'zlib.deflate'</span><span style="color: #007700">, </span><span style="color: #0000BB">STREAM_FILTER_WRITE</span><span style="color: #007700">, </span><span style="color: #0000BB">$params</span><span style="color: #007700">);
</span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">$original_text</span><span style="color: #007700">);
</span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);

echo </span><span style="color: #DD0000">"Le fichier compressé fait " </span><span style="color: #007700">. </span><span style="color: #0000BB">filesize</span><span style="color: #007700">(</span><span style="color: #DD0000">'test.deflated'</span><span style="color: #007700">) . </span><span style="color: #DD0000">" octets de long.\n"</span><span style="color: #007700">;
echo </span><span style="color: #DD0000">"Le texte original était :\n"</span><span style="color: #007700">;
</span><span style="color: #FF8000">/* Utilise readfile et zlib.inflate pour décompresser à la volée */
</span><span style="color: #0000BB">readfile</span><span style="color: #007700">(</span><span style="color: #DD0000">'php://filter/zlib.inflate/resource=test.deflated'</span><span style="color: #007700">);

</span><span style="color: #FF8000">/* 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.

 */
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

   </div>

   <div class="example" id="example-2">
    <p><strong>Exemple #2 
     <code class="literal">zlib.deflate</code> simple
    </strong></p>
    <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
$original_text </span><span style="color: #007700">= </span><span style="color: #DD0000">"This is a test.\nThis is only a test.\nThis is not an important string.\n"</span><span style="color: #007700">;
echo </span><span style="color: #DD0000">"Le texte original est long de " </span><span style="color: #007700">. </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$original_text</span><span style="color: #007700">) . </span><span style="color: #DD0000">" octets.\n"</span><span style="color: #007700">;

</span><span style="color: #0000BB">$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'test.deflated'</span><span style="color: #007700">, </span><span style="color: #DD0000">'w'</span><span style="color: #007700">);
</span><span style="color: #FF8000">/* Ici, "6" indique le niveau de compression de 6 */
</span><span style="color: #0000BB">stream_filter_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">'zlib.deflate'</span><span style="color: #007700">, </span><span style="color: #0000BB">STREAM_FILTER_WRITE</span><span style="color: #007700">, </span><span style="color: #0000BB">6</span><span style="color: #007700">);
</span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">$original_text</span><span style="color: #007700">);
</span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);

echo </span><span style="color: #DD0000">"Le fichier compressé fait " </span><span style="color: #007700">. </span><span style="color: #0000BB">filesize</span><span style="color: #007700">(</span><span style="color: #DD0000">'test.deflated'</span><span style="color: #007700">) . </span><span style="color: #DD0000">" octets de long.\n"</span><span style="color: #007700">;

</span><span style="color: #FF8000">/* Affiche :

Le texte original est long de 70 octets
Le fichier compressé fait 56 octets de long.

 */
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

   </div>
  </div>

  <div class="section" id="filters.compression.bzip2">
   <h2 class="title">bzip2.compress et bzip2.decompress</h2>
   <p class="simpara">
    <code class="literal">bzip2.compress</code> et
    <code class="literal">bzip2.decompress</code>
    fonctionnent de la même manière que les filtres zlib décrits ci-dessus.
    Le filtre <code class="literal">bzip2.compress</code> accepte jusqu&#039;à 2 paramètres,
    sous la forme d&#039;un <a href="language.types.array.php" class="link">tableau</a> associatif :

    <code class="parameter">blocks</code> est une valeur <a href="language.types.integer.php" class="link">entier</a>, de 1 à 9,
    spécifiant le nombre de blocs de 100 kb de mémoire à allouer à l&#039;espace de
    travail.

    <code class="parameter">work</code> est aussi un <a href="language.types.integer.php" class="link">entier</a> dont la valeur va de
    0 à 250, et qui indique le niveau d&#039;effort fourni avec une méthode de
    compression avant de passer à une autre méthode, plus lente. Modifier ce
    paramètre n&#039;a qu&#039;un effet sur la vitesse de compression. Le gain d&#039;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 <code class="literal">bzip2.decompress</code> accepte uniquement un paramètre,
    qui peut être passé sous la forme d&#039;un <a href="language.types.boolean.php" class="link">booléen</a>, ou en tant que l&#039;élément
    <code class="parameter">small</code> d&#039;un <a href="language.types.array.php" class="link">tableau</a> associatif.

    <code class="parameter">small</code>, lorsque défini à <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, indique à la
    bibliothèque bzip qu&#039;elle doit faire une décompression en utilisant le
    moins de mémoire possible, aux dépens de la vitesse.
   </p>

   <p class="simpara">
    Les filtres bzip2.* sont disponibles si le support de
    <a href="ref.bzip2.php" class="link">bz2</a> est activé.
   </p>

   <div class="example" id="example-3">
    <p><strong>Exemple #3 
     <code class="literal">bzip2.compress</code> et
     <code class="literal">bzip2.decompress</code>
    </strong></p>
    <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
$param </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'blocks' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">9</span><span style="color: #007700">, </span><span style="color: #DD0000">'work' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">0</span><span style="color: #007700">);

echo </span><span style="color: #DD0000">"Le fichier original fait " </span><span style="color: #007700">. </span><span style="color: #0000BB">filesize</span><span style="color: #007700">(</span><span style="color: #DD0000">'LICENSE'</span><span style="color: #007700">) . </span><span style="color: #DD0000">" octets de long.\n"</span><span style="color: #007700">;

</span><span style="color: #0000BB">$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'LICENSE.compressed'</span><span style="color: #007700">, </span><span style="color: #DD0000">'w'</span><span style="color: #007700">);
</span><span style="color: #0000BB">stream_filter_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">'bzip2.compress'</span><span style="color: #007700">, </span><span style="color: #0000BB">STREAM_FILTER_WRITE</span><span style="color: #007700">, </span><span style="color: #0000BB">$param</span><span style="color: #007700">);
</span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'LICENSE'</span><span style="color: #007700">));
</span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);

echo </span><span style="color: #DD0000">"Le fichier compressé fait " </span><span style="color: #007700">. </span><span style="color: #0000BB">filesize</span><span style="color: #007700">(</span><span style="color: #DD0000">'LICENSE.compressed'</span><span style="color: #007700">) . </span><span style="color: #DD0000">" octets de long.\n"</span><span style="color: #007700">;

</span><span style="color: #FF8000">/* Affiche :

Le fichier original fait 3288 octets de long.
Le fichier compressé fait 1488 octets de long.

 */
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

   </div>
  </div>
  </div><?php manual_footer($setup); ?>