Aunque las Envolturas de Compresión ofrecen una forma de crear archivos compatibles con gzip y bz2 en el sistema de archivos local, no ofrecen un método de compresión generalizado sobre secuencias de red, ni ofrecen la forma de comenzar con una secuencia no-comprimida y trasladarse a una comprimida. Para esto, un filtro de compresión puede ser aplicado sobre cualquier recurso de secuencia en cualquier momento.
Nota: Los filtros de compresión no generan cabeceras ni caracteres finales usados por utilidades de la línea de comandos como gzip. Sólo comprimen y descomprimen las porciones significativas de las secuencias de datos comprimidas.
zlib.deflate (compresión) y
zlib.inflate (descompresión) son implementaciones de
los métodos de compresión descritos en » RFC
1951. El filtro deflate recibe hasta tres
parámetros pasados como una matriz asociativa.
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: Dado que el nivel de compresión es el parámetro usado con mayor frecuencia, puede indicarse alternativamente como un valor entero simple (en lugar de un elemento tipo matriz).
Los filtros de compresión zlib.* están disponibles con PHP desde la versión 5.1.0 si el soporte de zlib se encuentra habilitado. También están disponibles como una característica portada de vuelta en la versión 5.0.x, instalando el paquete » zlib_filter desde » PECL. Estos filtros no están disponibles para PHP 4.
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
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 con PHP desde la versión 5.1.0 si el soporte de bz2 se encuentra habilitado. También se encuentran disponibles como una característica portada hacia atrás en la versión 5.0.x, instalando el paquete » bz2_filter desde » PECL. Estos filtros no se encuentran disponibles para PHP 4.
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.
*/
?>