Aunque las envolturas de compresión 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.
Nota: Los filtros de compresión no generan los encabezados y finales de ficheros, como lo hace la utilidad
gzip
. Solo comprimen y descomprimen porciones de flujo de datos.
zlib.deflate
(compresión) y
zlib.inflate
(descompresión) son las implementaciones
de los métodos de compresión presentados en la
» RFC 1951.
El filtro deflate
toma hasta tres parámetros, pasados
en forma de array asociativo.
level
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.
window
es el tamaño del buffer de memoria, en base 2.
Los valores superiores, hasta 15, es decir, 32768 bytes, dan mejores
compresiones, y los valores inferiores, hasta 9, es decir, 512 bytes,
ocupan menos espacio en memoria. Por defecto,
window
vale actualmente 15
.
memory
es una indicación del nivel de memoria
necesario.
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 la velocidad de ejecución,
y no el coste global.
Nota: Como el nivel de compresión es el parámetro más común, también puede ser proporcionado como valor int, en lugar de un array.
Los filtros de compresión zlib.* están disponibles si el soporte de zlib está activado.
Ejemplo #1
zlib.deflate
y
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 "El texto original es largo de " . strlen($original_text) . " bytes.\n";
$fp = fopen('test.deflated', 'w');
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, $params);
fwrite($fp, $original_text);
fclose($fp);
echo "El fichero comprimido hace " . filesize('test.deflated') . " bytes de largo.\n";
echo "El texto original era :\n";
/* Utiliza readfile y zlib.inflate para descomprimir al vuelo */
readfile('php://filter/zlib.inflate/resource=test.deflated');
/* Muestra :
El texto original es largo de 70 bytes
El fichero comprimido hace 56 bytes de largo.
El texto original era :
This is a test.
This is only a test.
This is not an important string.
*/
?>
Ejemplo #2
zlib.deflate
simple
<?php
$original_text = "This is a test.\nThis is only a test.\nThis is not an important string.\n";
echo "El texto original es largo de " . strlen($original_text) . " bytes.\n";
$fp = fopen('test.deflated', 'w');
/* Aquí, "6" indica el nivel de compresión de 6 */
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, 6);
fwrite($fp, $original_text);
fclose($fp);
echo "El fichero comprimido hace " . filesize('test.deflated') . " bytes de largo.\n";
/* Muestra :
El texto original es largo de 70 bytes
El fichero comprimido hace 56 bytes de largo.
*/
?>
bzip2.compress
y
bzip2.decompress
funcionan de la misma manera que los filtros zlib descritos anteriormente.
El filtro bzip2.compress
acepta hasta 2 parámetros,
en forma de array asociativo:
blocks
es un valor int, de 1 a 9,
especificando el número de bloques de 100 kb de memoria a asignar al espacio de
trabajo.
work
es también un int 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. 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 bzip2.decompress
acepta únicamente un parámetro,
que puede ser pasado en forma de bool, o como el elemento
small
de un array asociativo.
small
, cuando se define a true
, indica a la
biblioteca bzip que debe realizar una descompresión utilizando la menor cantidad de memoria posible, a expensas de la velocidad.
Los filtros bzip2.* están disponibles si el soporte de bz2 está activado.
Ejemplo #3
bzip2.compress
y
bzip2.decompress
<?php
$param = array('blocks' => 9, 'work' => 0);
echo "El fichero original hace " . strlen(LICENSE) . " bytes de largo.\n";
$fp = fopen('LICENSE.compressed', 'w');
stream_filter_append($fp, 'bzip2.compress', STREAM_FILTER_WRITE, $param);
fwrite($fp, file_get_contents('LICENSE'));
fclose($fp);
echo "El fichero comprimido hace " . filesize('LICENSE.compressed') . " bytes de largo.\n";
/* Muestra :
El fichero original hace 3288 bytes de largo.
El fichero comprimido hace 1488 bytes de largo.
*/
?>