## Filtros de compresión

Mientras que los Envoltorios de compresión proporcionan una forma de crear ficheros gzip y bz2 compatibles con el sistema de archivos local, no proporcionan un medio para la compresión generalizada sobre los flujos de la red, ni proporcionan un medio para comenzar con un flujo no comprimido y la transición a uno comprimido. Para ello, se puede aplicar un filtro de compresión a cualquier recurso de flujo en cualquier momento.

> Nota: Los filtros de compresión no generan cabeceras y avances utilizadas por las utilidades de línea de comando como `gzip`. Sólo comprimen y descomprimen las porciones de carga útil de los flujos de datos comprimidos.

## zlib.deflate y zlib.inflate

`zlib.deflate` (compresión) y `zlib.inflate` (descompresión) son implementaciones de los métodos de compresión descritos en » RFC 1951. Los filtros `deflate` toma hasta tres parámetros pasados como un array asociativo. `level` describe la intensidad de compresión (1-9). Números más grandes producen, por lo general, resultados más pequeños, al costo de tiempo de procesamiento adicional. Dos niveles de compresión especiales existen también: 0 (para no-compresión), y -1 (el valor predeterminado de zlib -- actualmente 6). `window` es el registro en base-2 del tamaño de ventana del circuito cerrado de compresión. Valores más altos (de hasta 15 -- 32768 bytes) producen mejor compresión al costo de más memoria, mientras valores más bajos (alrededor de 9 -- 512 bytes) producen una compresión inferior en un espacio de memoria más pequeño. El tamaño de `window` es actualmente `15`. `memory` es una escala que indica cuánta memoria debería ser reservada. Los valores válidos están en el rango de 1 (reserva mínima) a 9 (reserva máxima). Esta reserva de memoria afecta únicamente la repidez y no tiene impacto en el tamaño del resultado generado.

> Nota: Debido a que el nivel de compresión es el parámetro más comúnmente usado, puede ser alternativamente proporcionado como un valor entero simple (en lugar de un elemento de array).

Los filtros de compresión zlib.* están disponibles si eaaqyhfgrtl soporte de zlib se encuentra habilitado.

Ejemplo #1 `zlib.deflate` y `zlib.inflate`

`<?php
$params = array('level' => 6, 'window' => 15, 'memory' => 9);
$texto_original = "Esto es una prueba.\nEsto es solo una prueba.\nEsta no es una cadena importante.\n";
echo "El texto original tiene " . strlen($texto_original) . " caracteres.\n";
$da = fopen('test.deflated', 'w');
stream_filter_append($da, 'zlib.deflate', STREAM_FILTER_WRITE, $params);
fwrite($da, $texto_original);
fclose($da);
echo "El archivo comprimido tiene " . filesize('test.deflated') . " bytes.\n";
echo "El texto original era:\n";
/* Use readfile y zlib.inflate para descomprimir al vuelo */
readfile('php://filter/zlib.inflate/resource=test.deflated');
/* Genera la salida:
El texto original tiene 79 caracteres.
El archivo comprimido tiene 59 bytes.
El texto original era:
Esto es una prueba.
Esto es solo una prueba.
Esta no es una cadena importante.
*/
?>`

Ejemplo #2 `zlib.deflate` simple

`<?php
$texto_original = "Esto es una prueba.\nEsto es solo una prueba.\nEsta no es una cadena importante.\n";
echo "El texto original tiene " . strlen($texto_original) . " caracteres.\n";
$da = fopen('test.deflated', 'w');
/* Aqui "6" indica el nivel 6 de compresion */
stream_filter_append($da, 'zlib.deflate', STREAM_FILTER_WRITE, 6);
fwrite($da, $texto_original);
fclose($da);
echo "El archivo comprimido tiene " . filesize('test.deflated') . " bytes.\n";
/* Genera la salida:
El texto original tiene 79 caracteres.
El archivo comprimido tiene 53 bytes.
*/
?>`

## bzip2.compress y bzip2.decompress

`bzip2.compress` y `bzip2.decompress` funcionan de la misma forma que los filtros zlib descritos anteriormente. El filtro `bzip2.compress` acepta hasta dos parámetros dados como elementos de una matriz asociativa: `blocks` es un valor entero desde 1 hasta 9 que indica el número de bloques de 100kbytes de memoria a reservar para el espacio de trabajo. `work` es también un valor entero que va desde 0 a 250, e indica cuánto esfuerzo debe invertirse para expandir usando el método de compresión normal antes de caer en un método más lento pero más confiable. Modificar este parámetro afecta únicamente la rapidez de compresién. Ni el tamaño de la salida comprimida ni el uso de memoria se modifican por este valor. Un factor de trabajo de 0 le indica a la biblioteca bzip que debe usar el valor interno predeterminado. El filtro `bzip2.decompress` sólo acepta un parámetro, el cual puede ser pasado como un valor booleano ordinario, o como el elemento `small` de una matriz asociativa. `small`, cuando se define a un valor `true`, le indica a la biblioteca bzip de realice una descompresión con una cantidad de memoria mínima, al costo de la rapidez.

Las filtros de compresión bzip2.* se encuentran disponibles si el soporte de bz2 se encuentra habilitado.

Ejemplo #3 `bzip2.compress` y `bzip2.decompress`

`<?php
$param = array('blocks' => 9, 'work' => 0);
echo "El archivo original tiene " . filesize('LICENSE') . " bytes.\n";
$da = fopen('LICENSE.compressed', 'w');
stream_filter_append($da, 'bzip2.compress', STREAM_FILTER_WRITE, $param);
fwrite($da, file_get_contents('LICENSE'));
fclose($da);
echo "El archivo comprimido tiene " . filesize('LICENSE.compressed') . " bytes.\n";
/* Genera la salida:
El archivo original tiene 3288 bytes.
El archivo comprimido tiene 1488 bytes.
*/
?>`