Manual do PHP
Anterior | Apêndice O. Lista de Filtros Disponíveis | Próxima

# Filtros de Compressão

Enquanto os a seção Compression Streams Apêndice N 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 à Referência CLXXXVIII, Zlib - Funções de Compressão 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.

Exemplo O-7. `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. */ ?>`

Exemplo O-8. `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"; /* 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 à Referência IX, 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.

Exemplo O-9. `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"; /* Generates output: The original text is 3288 characters long. The compressed file is 1488 bytes long. */ ?>`

Anterior | Principal | Próxima
Fitros de Conversão | Acima | Encryption Filters