Filtros de Compressão

Enquanto os Wrappers de Compressão fornecem uma maneira de criar arquivos compatíveis com gzip e bz2 no sistema de arquivos local, eles não fornecem um meio para compressão generalizada sobre streams de rede, nem fornecem uma maneira de começar com uma stream não-comprimida e mudar para uma comprimida. Para isso, um filtro de compressão pode ser aplicado a qualquer recurso de stream em qualquer momento.

Note: 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 comprimidas.

zlib.deflate and zlib.inflate

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 (até 15 -- 32768 bytes) resultam em melhor compressão ao custo de memória, enquanto valores menores (até 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ínima) até 9 (alocação máxima). Essa alocação de memória afeta apenas a velocidade e não tem impacto sobre o tamanho do conteúdo gerado.

Note: Pelo fato do nível de compressão ser o parâmetro mais usado normalmente, ele pode ser passado de maneira alternativa como um simples valor inteiro (ao invés de um elemento de um array).

Filtros de compressão zlib.* compression estarão disponíveis se o suporte ao zlib estiver ativado.

Example #1 zlib.deflate e zlib.inflate

<?php
$params = array('level' => 6, 'window' => 15, 'memory' => 9);

$original_text = "Isto é um teste.\nIsto é apenas um teste.\nEsta não é uma string importante.\n";
echo "O texto original tem " . strlen($original_text) . " caracteres.\n";

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

echo "O arquivo comprimido tem " . filesize('test.deflated') . " bytes.\n";
echo "O texto original era:\n";
/* Use readfile e zlib.inflate para descomprimir de forma improvisada */
readfile('php://filter/zlib.inflate/resource=test.deflated');

/* Gera a saída:

O texto original tem 79 caracteres.
O arquivo comprimido tem 61 bytes.
O texto original era:
Isto é um teste.
Isto é apenas um teste.
Esta não é uma string importante.

 */
?>

Example #2 zlib.deflate simples

<?php
$original_text = "Isto é um teste.\nIsto é apenas um teste.\nEsta não é uma string importante.\n";
echo "O texto original tem " . strlen($original_text) . " caracteres.\n";

$fp = fopen('test.deflated', 'w');
/* Aqui "6" indica nível de compressão 6 */
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, 6);
fwrite($fp, $original_text);
fclose($fp);

echo "O arquivo comprimido tem " . filesize('test.deflated') . " bytes.\n";

/* Gera a saída:

O texto original tem 79 caracteres.
O arquivo comprimido tem 60 bytes.

 */
?>

bzip2.compress and bzip2.decompress

bzip2.compress e bzip2.decompress funcionam da mesma maneira que 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 de 0 a 250 indicando quanto esforço será realizado 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 booleano 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 ao custo da velocidade.

Filtros de compressão bzip2.* estão disponíveis se suporte a bz2 estiver ativado.

Example #3 bzip2.compress e bzip2.decompress

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

echo "O arquivo original tem " . filesize('LICENSE') . " bytes.\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 "O arquivo comprimido tem " . filesize('LICENSE.compressed') . " bytes.\n";

/* Gera a saída:

O arquivo original tem 3288 bytes.
O arquivo comprimido tem 1488 bytes.

 */
?>