<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'filters.compression.php',
    1 => 'Filtros de compresi&oacute;n',
    2 => 'Filtros de compresi&oacute;n',
  ),
  'up' => 
  array (
    0 => 'filters.php',
    1 => 'Lista de filtros est&aacute;ndar',
  ),
  'prev' => 
  array (
    0 => 'filters.convert.php',
    1 => 'Filtros de conversi&oacute;n',
  ),
  'next' => 
  array (
    0 => 'filters.encryption.php',
    1 => 'Filtros de cifrado',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Filtros de compresión</h2>

  <p class="simpara">
   Aunque las <a href="wrappers.compression.php" class="link">envolturas de
   compresión</a>  proporcionan un medio para generar ficheros en los
   formatos gzip y bz2, no permiten manejar los protocolos de red
   comprimidos, ni comenzar con un flujo no comprimido para transformarlo
   en flujo comprimido. Para ello, un filtro de compresión puede ser aplicado
   en cualquier momento a cualquier recurso de flujo.
  </p>

  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="simpara">
    Los filtros de compresión <em>no generan</em> los encabezados
    y finales de ficheros, como lo hace la utilidad <code class="literal">gzip</code>.
    Solo comprimen y descomprimen porciones de flujo de datos.
   </p>
  </p></blockquote>

  <div class="section" id="filters.compression.zlib">
   <h2 class="title">zlib.deflate y zlib.inflate</h2>
   <p class="para">
    <code class="literal">zlib.deflate</code> (compresión) y
    <code class="literal">zlib.inflate</code> (descompresión) son las implementaciones
    de los métodos de compresión presentados en la
    <a href="https://datatracker.ietf.org/doc/html/rfc1951" class="link external">&raquo;&nbsp;RFC 1951</a>.
    El filtro <code class="literal">deflate</code> toma hasta tres parámetros, pasados
    en forma de <span class="type"><a href="language.types.array.php" class="type array">array</a></span> asociativo.

    <code class="parameter">level</code> especifica el nivel de compresión deseado,
    de 1 a 9. Cuanto más alto sea el nivel, mejor será la compresión, y más
    costoso será el coste de compresión. Existen dos niveles de compresión especiales:
    0, que representa la ausencia de compresión, y -1, que representa el nivel por defecto de zlib:
    actualmente, 6.

    <code class="parameter">window</code> es el logaritmo en base 2 del tamaño de la
    ventana de compresión. Los valores superiores, hasta 15, es decir, 32768 bytes,
    dan una mejor compresión a costa de más memoria, y los valores inferiores,
    hasta 9, es decir, 512 bytes, dan una compresión menor ocupando menos
    espacio en memoria. Por defecto,
    <code class="parameter">window</code> vale actualmente <code class="literal">15</code>.

    El filtro <code class="literal">zlib.deflate</code> implementa los métodos de
    compresión <code class="literal">DEFLATE</code>, <code class="literal">ZLIB</code> y
    <code class="literal">GZIP</code> según el valor del parámetro
    <code class="parameter">window</code>.

    Los 4 bits inferiores del parámetro window fijan el tamaño del
    «búfer de historial» interno utilizado, siendo el logaritmo en base 2 de su
    tamaño, en un rango de 8 a 15. El significado de los demás bits del
    parámetro window puede fijarse como se describe a continuación.

    <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>)
       es un algoritmo de compresión sin tratar, sin encabezado ni suma de
       verificación. Se aplica cuando el parámetro window se fija en el rango
       de -9 a -15. Este algoritmo de compresión es la base de todos los
       formatos generados por el filtro <code class="literal">zlib.deflate</code>.
       Las funciones correspondientes que operan directamente sobre strings son
       <span class="function"><a href="function.gzdeflate.php" class="function">gzdeflate()</a></span> y <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>)
       aplica el algoritmo <code class="literal">DEFLATE</code> y añade un encabezado de
       2 bytes y un tráiler de 4 bytes que contiene la suma de verificación
       Adler32 de los datos sin comprimir, en orden de bytes big-endian:
       <code class="literal"><div class="cdata"><pre>ZLIB = ZLIBHEADER(2B)  DEFLATE  ADLER32(4B)</pre></div></code>

       El encabezado de 2 bytes, leído como un número de 16 bits sin signo en
       orden big-endian, debe ser múltiplo de 31.
       Este formato se genera cuando el parámetro window se fija en el rango
       de 8 a 15.
       Las funciones correspondientes que operan directamente sobre strings son
       <span class="function"><a href="function.gzcompress.php" class="function">gzcompress()</a></span> y <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>)
       aplica el algoritmo <code class="literal">DEFLATE</code> añadiendo un encabezado y
       un tráiler con la suma de verificación <code class="literal">CRC32</code> de los
       datos sin comprimir y su longitud, ambos en orden de bytes little-endian:
       <code class="literal"><div class="cdata"><pre>GZIP = GZIPHEADER(10B)  DEFLATE  CRC32(4B)  LENGTH(4B)</pre></div></code>

       Es el formato de los ficheros <code class="literal">.gz</code>, en el que
       <code class="literal">GZIPHEADER</code> contiene, en este orden, la firma
       <code class="literal">GZIP</code> (<code class="literal">\x1f\x8B</code>), el método de
       compresión (<code class="literal">\x08</code>), un byte de flags a cero, una fecha
       de modificación a cero en 4 bytes, un byte de flags adicionales que
       depende del nivel de compresión, y el sistema operativo fijado al sistema
       actual (<code class="literal">\x00</code> = sistema de ficheros FAT,
       <code class="literal">\x03</code> = Unix, etc.).
       Este formato se genera cuando el parámetro window se fija en el rango
       de 9+16=25 a 15+16=31. Tenga en cuenta que existe un límite de 4GB para
       la longitud máxima de los datos sin comprimir; más allá de este límite,
       solo se almacena el módulo 2^32 de la longitud real en la parte
       <code class="literal">LENGTH</code>.
       Las funciones correspondientes que operan directamente sobre strings son
       <span class="function"><a href="function.gzencode.php" class="function">gzencode()</a></span> y <span class="function"><a href="function.gzdecode.php" class="function">gzdecode()</a></span>; la
       función <span class="function"><a href="function.gzopen.php" class="function">gzopen()</a></span> permite leer y escribir ficheros
       <code class="literal">.gz</code>.
      </p>
     </li>
    </ul>

    Con el filtro <code class="literal">zlib.inflate</code>, solo se admite el parámetro
    <code class="parameter">window</code>; cualquier otro parámetro
    (<code class="parameter">memory</code>, <code class="parameter">level</code>) se ignora.
    Sea $W el logaritmo en base 2 del tamaño del búfer de historial, de modo
    que el descompresor asigna 2^$W bytes. Para el formato ZLIB, este valor
    debe ser mayor o igual al registrado en el encabezado, lo cual se
    comprueba durante la descompresión; para los demás formatos, basta con
    que sea lo suficientemente grande para las distancias de coincidencia
    realmente presentes en los datos.
    El rango es 9 ≤ $W ≤ 15. Si se desconoce, $W=15 es la opción más segura.

    <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>):
        utilice window=-$W, siendo $W un valor no inferior al utilizado para
        la compresión. Si se desconoce, fije 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>):
        utilice window=$W. El valor de $W puede obtenerse del propio encabezado
        ZLIB; en caso contrario, fije 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>):
       utilice window=$W+16. Un encabezado GZIP no contiene el tamaño de la
       ventana, por lo que debe fijarse window=31, salvo que se conozca el valor
       utilizado para la compresión.
      </p>
     </li>

     <li class="listitem">
      <p class="simpara">
       <code class="literal">ZLIB o GZIP</code>:
       utilice window=$W+32 para la detección automática del encabezado, de
       modo que ambos formatos puedan reconocerse y descomprimirse;
       window=15+32=47 es la opción más segura.
      </p>
     </li>
    </ul>

    <code class="parameter">memory</code> es una escala que indica cuánta memoria de
    trabajo debe asignarse.
    Los valores válidos van de 1, para la asignación mínima, a 9, para una
    asignación máxima. La asignación de memoria afecta únicamente a la velocidad
    de ejecución y no influye en el tamaño de los datos generados.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="simpara">
     Como el nivel de compresión es el parámetro más común, también puede ser proporcionado
     como valor <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>, en lugar de un <span class="type"><a href="language.types.array.php" class="type array">array</a></span>.
    </p>
   </p></blockquote>

   <p class="simpara">
    Los filtros de compresión zlib.* están disponibles si el soporte de
    <a href="ref.zlib.php" class="link">zlib</a> está activado.
   </p>

   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 
     <code class="literal">zlib.deflate</code> y
     <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">"El texto original tiene " </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">" caracteres.\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">"El fichero comprimido tiene " </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">" bytes.\n"</span><span style="color: #007700">;
echo </span><span style="color: #DD0000">"El texto original era:\n"</span><span style="color: #007700">;
</span><span style="color: #FF8000">/* Utiliza readfile y zlib.inflate para descomprimir al vuelo */
</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">/* Muestra:

El texto original tiene 70 caracteres.
El fichero comprimido tiene 56 bytes.
El texto original era:
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>Ejemplo #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">"El texto original tiene " </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">" caracteres.\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">/* Aquí, "6" indica el nivel de compresión 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">"El fichero comprimido tiene " </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">" bytes.\n"</span><span style="color: #007700">;

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

El texto original tiene 70 caracteres.
El fichero comprimido tiene 56 bytes.

 */
</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 y bzip2.decompress</h2>
   <p class="simpara">
    <code class="literal">bzip2.compress</code> y
    <code class="literal">bzip2.decompress</code>
    funcionan de la misma manera que los filtros zlib descritos anteriormente.
    El filtro <code class="literal">bzip2.compress</code> acepta hasta 2 parámetros,
    en forma de <span class="type"><a href="language.types.array.php" class="type array">array</a></span> asociativo:

    <code class="parameter">blocks</code> es un valor <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>, de 1 a 9,
    especificando el número de bloques de 100 kb de memoria a asignar al espacio de
    trabajo.

    <code class="parameter">work</code> es también un <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> cuyo valor va de
    0 a 250, e indica el nivel de esfuerzo proporcionado con un método de
    compresión antes de pasar a otro método, más lento pero más fiable. Modificar este
    parámetro solo tiene efecto en la velocidad de compresión. La ganancia de espacio
    o la memoria utilizada permanecen iguales. Un nivel de 0 indica que la
    biblioteca debe utilizar su configuración por defecto.

    El filtro <code class="literal">bzip2.decompress</code> acepta únicamente un parámetro,
    que puede ser pasado en forma de <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>, o como el elemento
    <code class="parameter">small</code> de un <span class="type"><a href="language.types.array.php" class="type array">array</a></span> asociativo.

    <code class="parameter">small</code>, cuando se define a <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, indica a la
    biblioteca bzip que debe realizar una descompresión utilizando la menor cantidad de memoria posible, a expensas de la velocidad.
   </p>

   <p class="simpara">
    Los filtros bzip2.* están disponibles si el soporte de
    <a href="ref.bzip2.php" class="link">bz2</a> está activado.
   </p>

   <div class="example" id="example-3">
    <p><strong>Ejemplo #3 
     <code class="literal">bzip2.compress</code> y
     <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">"El fichero original tiene " </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">" bytes.\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">"El fichero comprimido tiene " </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">" bytes.\n"</span><span style="color: #007700">;

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

El fichero original tiene 3288 bytes.
El fichero comprimido tiene 1488 bytes.

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

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