Forum und email

Filtros de Compressão

Enquanto os Compression Streams permitem uma maneira de criar arquivos compatíveis com gzip and bz2 no seu sistema de arquivos local, eles não permitem meios para compressão generalizada sobre streams de rede, nem permitem uma maneira de começar com uma stream não-comprimida e mudar para uma comprimida. Para isso, um filtro comprimido pode ser aplicado a qualquer recuso de stream em qualquer momento.

Nota: Filtros de compressão não geram cabeçalhos e rodapés usados por utilitários de linha de comando como o gzip. Eles apenas comprimem e descomprimem as porções de conteúdo das streams de dados comprimidos.

zlib.deflate (compressão) e zlib.inflate (descompressão) são implementações dos métodos de compressão descritos no » RFC 1951. O filtro deflate recebe até três parâmetros passados como um array associativo. level descreve o nível de compressão a ser usada (1-9). Números mais altos geralmente resultam em cargas menores com o custo de tempo de processamento adicional. Dois níveis especiais de compressão também existem: 0 (para nenhuma compressão), e -1 (padrão interno da zlib -- atualmente 6). window é o logaritmo na base 2 do tamanho da janela de loopback de compressão. Valores mais altos (acima de 15 -- 32768 bytes) resultam em melhor compressão com o custo de memória, enquanto valores menores (abaixo de 9 -- 512 bytes) resultam em pior compressão usando menos memória. O tamanho padrão de window atualmente é 15. memory é uma escala indicando quanta memória deve ser alocada para trabalhar. Valores válidos vão de 1 (alocação máxima) até 9 (alocação mínima). Essa alocação de memória afeta apenas a velocidade e não tem impacto sobre o tamanho da carga gerada.

Nota: O nível de compressão, por ser o parâmetro mais usado normalmente, pode ser passado de maneira alternativa com um simples valor inteiro (ao invés de um elemento de um array).

Filtros de compressão zlib estão disponíveis com o PHP a partir da versão 5.1.0 se o suporte à Zlib estiver ativado. Eles também estão disponíveis como uma backport na versão 5.0.x instalando o pacote » zlib_filter da » PECL. Esses filtros não estão disponíveis para o PHP 4.

Example#1 zlib.deflate e 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 
"The original text is " strlen($original_text) . " characters long.\n";

$fp fopen('test.deflated''w');
stream_filter_append($fp'zlib.deflate'STREAM_FILTER_WRITE$params);
fwrite($fp$original_text);
fclose($fp);

echo 
"The compressed file is " filesize('test.deflated') . " bytes long.\n";
echo 
"The original text was:\n";
/* Use readfile and zlib.inflate to decompress on the fly */
readfile('php://filter/zlib.inflate/resource=test.deflated');

/* Generates output:

The original text is 70 characters long.
The compressed file is 56 bytes long.
The original text was:
This is a test.
This is only a test.
This is not an important string.

 */
?>

Example#2 zlib.deflate simples

<?php
$original_text 
"This is a test.\nThis is only a test.\nThis is not an important string.\n";
echo 
"The original text is " strlen($original_text) . " characters long.\n";

$fp fopen('test.deflated''w');
/* Here "6" indicates compression level 6 */
stream_filter_append($fp'zlib.deflate'STREAM_FILTER_WRITE6);
fwrite($fp$original_text);
fclose($fp);

echo 
"The compressed file is " filesize('test.deflated') . " bytes long.\n";

/* Generates output:

The original text is 70 characters long.
The compressed file is 56 bytes long.

 */
?>

bzip2.compress e bzip2.decompress funcionam da mesma maneira como os filtros da zlib descritos acima. O filtro bzip2.compress aceitam até dois parâmetros passados como elementos de um array associativo: blocks é um valor inteiro de 1 até 9 especificando o número de blocos de 100kbyte de memória para alocar para o espaço de trabalho. work também é um valor inteiro variando entre 0 e 250 indicando quanto esforço a será gasto usando o método normal de compressão antes de desistir e usar um mais lento, mas mais confiável. Alterar esse parâmetro afeta apenas a velocidade de compressão. Nem o tamanho da saída comprimida nem o uso de memória são alterados por essa configuração. Um fator de trabalho de 0 diz à biblioteca bzip para usar o padrão interno. O filtro bzip2.decompress só aceita um parâmetro, que pode ser passado ou como um valor boolean comum ou como o elemento small de um array associativo. small , quando configurado para o valor TRUE, diz a biblioteca bzip para fazer a descompressão usando o mínimo de memória com o custo de velocidade.

Filtros de compressão bzip2 estão disponíveis no PHP a partir da versão 5.1.0 se o suporte à Bzip2 estiver ativado. Eles também estão disponíveis como um backport na versão 5.0.x instalando o pacote » bz2_filter da » PECL. Esses filtros não estão disponíveis para o PHP 4.

Example#3 bzip2.compress e bzip2.decompress

<?php
$param 
= array('blocks' => 9'work' => 0);

echo 
"The original file is " filesize('LICENSE') . " bytes long.\n";

$fp fopen('LICENSE.compressed''w');
stream_filter_append($fp'bzip2.compress'STREAM_FILTER_WRITE$param);
fwrite($fpfile_get_contents('LICENSE'));
fclose($fp);

echo 
"The compressed file is " filesize('LICENSE.compressed') . " bytes long.\n";

/* Generates output:

The original text is 3288 characters long.
The compressed file is 1488 bytes long.

 */
?>