Forum und email
Kompresní filtry

Kompresní filtry

Zatímco Kompresní wrappery poskytují cestu k vytváření kompatibilních GZIP a BZ2 souborů v místním souborovém systému, nejsou schopny poskytnout zobecněnou kompresi síťových streamů, ani možnost začít s nekomprimovaným streamem a změnit ho na komprimovaný. Kompresní filtry lze ovšem kdykoli aplikovat na libovolný stream.

Poznámka: Kompresní filtry negenerují hlavičky a ukončovací sekvence, jak to dělají konzolové utility jako gzip. Pouze komprimují a dekomprimují užitečné části datových streamů.

zlib.deflate (komprese) a zlib.inflate (dekomprese) jsou implementace kompresních metod popsaných v RFC 1951. Filtr deflate přijímá až tři parametry předané jako asociativní pole. level udává, jakou účinnost komprese použít (1-9). Vyšší čísla vedou k menšímu objemu dat za cenu delšího času zpracování. Existují také dvě speciální kompresní úrovně: 0 (žádná komprese) a -1 (vnitřní výchozí hodnota zlib - momentálně 6). window je dvojkový logaritmus velikosti kompresního okna. Vyšší hodnoty (až 15 -- 32768 B) vedou k lepší kompresi při větších nárocích na paměť. kdežto nižší (od 9 -- 512 B) znamenají horší kompresi za menší spotřeby paměti. Výchozí hodnota parametru window je nyní 15. memory udává, kolik paměti by se mělo alokovat. Rozsah platných hodnot je od 1 (minimální alokace) do 9 (maximální alokace). Tato hodnota má vliv pouze na rychlost, neovlivňuje účinnost komprese.

Poznámka: Protože úroveň komprese je nejčastěji používaným parametrem, lze ji alternativně udat také jako obyčejnou celočíselnou hodnotu (namísto prvku pole).

Kompresní filtry zlib.* jsou k dispozici v PHP od verze 5.1.0, pokud je zapnuta podpora zlib. Jsou dostupné též jako backport ve verzi 5.0.x po nainstalování balíku zlib_filter z PECL. Tyto filtry nejsou dostupné v PHP 4.

Příklad O-7. zlib.deflate a zlib.inflate

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

$original_text = "Toto je test.\nToto je pouze test.\nToto není důležitý řetězec.\n";
echo
"Původní text je " . strlen($original_text) . " znaků dlouhý.\n";

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

echo
"Komprimovaný soubor je " . filesize('test.deflated') . " B velký.\n";
echo
"Původní text byl:\n";
/* Použij readfile a zlib.inflate k dekompresi "za letu" */
readfile('php://filter/zlib.inflate/resource=test.deflated');

/* Vygeneruje výstup:

Původní text je 70 znaků dlouhý.
Komprimovaný soubor je 56 B velký.
Původní text byl:
Toto je test.
Toto je pouze test.
Toto není důležitý řetězec.

*/
?>

Příklad O-8. jednoduché zlib.deflate

<?php
$original_text
= "Toto je test.\nToto je pouze test.\nToto není důležitý řetězec.\n";
echo
"P?vodní text je " . strlen($original_text) . " znaků dlouhý.\n";

$fp = fopen('test.deflated', 'w');
/* zde "6" indikuje úroveň komprese 6 */
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, 6);
fwrite($fp, $original_text);
fclose($fp);

echo
"Komprimovaný soubor je " . filesize('test.deflated') . " B velký.\n";

/*  Vygeneruje výstup:

Původní text je 70 znaků dlouhý.
Komprimovaný soubor je 56 B velký.

*/
?>

bzip2.compress a bzip2.decompress pracují stejným způsobem jako filtry zlib popsané výše. Filtr bzip2.compress přijímá až dva parametry poskytnuté jako prvky asociativního pole: blocks je hodnota typu integer od 1 do 9, udávající počet 100KB bloků paměti, které se alokují pro zpracování. work je také typu integer, a to v rozmezí 0 až 250. Říká, jak velké úsilí se má vynaložit s normální kompresní metodou, než se přejde na pomalejší, ale spolehlivější metodu. Ladění tohoto parametru má vliv pouze na rychlost komprese. Nemění se tím ani velikost komprimovaného výstupu, ani využití paměti. Hodnota 0 znamená, že knihovna bzip použije vnitřní výchozí hodnotu. Filtr bzip2.decompress přijímá pouze jeden parametr, který se předává buď jako normální pravdivostní hodnota, nebo jako prvek small v asociativním poli. small, pokud má hodnotu TRUE, říká knihovně bzip, že se má k dekompresi použít minimální množství paměti na úkor rychlosti.

Kompresní filtry bzip2.* jsou dostupné od verze 5.1.0, pokud je zapnuta podpora bz2. Jsou dostupné též jako backport ve verzi 5.0.x po nainstalování balíku bz2_filter z PECL. Tyto filtry nejsou dostupné v PHP 4.

Příklad O-9. bzip2.compress a bzip2.decompress

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

echo
"Původní soubor je " . filesize('LICENSE') . " B velký.\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
"Komprimovaný soubor je " . filesize('LICENSE.compressed') . " B velký.\n";

/* Vygenerovaný výstup:

Původní soubor je 3288 B velký.
Komprimovaný soubor je 1488 B velký.

*/
?>