Enquanto os Filtros de Compressão permitem uma maneira de criar arquivos compatíveis com gzip and bz2 no seu sistema de arquivos local, eles não possuem meios para compressão generalizada sobre streams de rede, nem possuem 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 recurso 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 do arquivo 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.
Exemplo #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');
/* Gera a saída:
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.
*/
?>
Exemplo #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_WRITE, 6);
fwrite($fp, $original_text);
fclose($fp);
echo "The compressed file is " . filesize('test.deflated') . " bytes long.\n";
/* Gera a saída:
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 aceita 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 à 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 à bz2 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.
Exemplo #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($fp, file_get_contents('LICENSE'));
fclose($fp);
echo "The compressed file is " . filesize('LICENSE.compressed') . " bytes long.\n";
/* Gera a saída:
The original text is 3288 characters long.
The compressed file is 1488 bytes long.
*/
?>