Forum und email

Kompresné filtre

Zatiaľ čo Prúdy Kompresie poskytujú spôsob tvorby gzip a bz2 kompatibilných súborov na miestnom filesystéme, neposkytujú spôsob pre zovšeobecnenú kompresiu cez prúdy siete, neposkytujú ani spôsob na začatie s nekompresným prúdom a tranzíciu ku kompresnému prúdu. Pre toto môže byť kompresný filter aplikovaný na hocaký zdroj prúdu kedykoľvek.

Note: Kompresné filtre negenerujú hlavičky a päty používané commandline utilitami ako gzip. Iba komprimujú a dekomprimujú payload porcie kompresovaných dátových prúdov.

zlib.deflate (kompresia) a zlib.inflate (dekompresia) sú implementácie kompresných metód popísaných v » RFC 1951. Filter deflate berie až tri parametre poslané ako asociatívne pole. level popisuje, akú kompresnú silu použiť (1-9). Vyššie číslo všeobecne zabezpečí menšie payloady za cenu dodatočného času spracovania. Tiež existujú dva špeciálne kompresné levely: 0 (pre žiadnu kompresiu) a -1 (zlib vnútorný default -- momentálne 6). window je base-2 log loopback veľkosti window kompresie. Vyššie hodnoty (až 15 -- 32768 bytov) zabezpečia lepšiu kompresiu za cenu pamäte, zatiaľčo nižšie hodnoty (až po 9 -- 512 bytov) zabezpečia horšiu kompresiu v menšej tlačovej stope pamäte. Východzia veľkosť window je momentálne 15. memory je škála indikujúca koľko pracovnej pamäte by sa malo alokovať. Platný rozsah hodnôt od 1 (minimálna alokácia) do 9 (maximálna alokácia). Táto alokácia pamäte ovplyvňuje iba rýchlosť a neovplynňuje veľkosť generovaného payloadu.

Note: Pretože kompresný level je najbežnejšie používaný parameter, alternatívne môže byť poskytnutý ako jednoduchá hodnota integer (než prvok poľa).

Kompresné filtre zlib.* sú dostupné v PHP od verzie 5.1.0 ak je Chýbajúce veci podpora povolená. Sú tiež dostupné ako backport vo verzii 5.0.x inštalovaním balíka » zlib_filter z » PECL. Tieto filtre nie sú dostupné pre PHP 4.

Example#1 zlib.deflate a zlib.inflate

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

$original_text "Toto je test.\nToto je iba test.\nToto nie je dolezity string.\n";
echo 
"Povodny text je " strlen($original_text) . " znakov dlhy.\n";

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

echo 
"Komprimovany subor je " filesize('test.deflated') . " bytov dlhy.\n";
echo 
"Povodny text bol:\n";
/* Pouzite readfile a zlib.inflate na dekompresiu on the fly */
readfile('php://filter/zlib.inflate/resource=test.deflated');

/* Generuje vystup:

Povodny text je 70 znakov dlhy.
Komprimovany subor je 56 bytov dlhy.
Povodny text bol:
Toto je test.
Toto je iba test.
Toto nie je dolezity sring.

 */
?>

Example#2 zlib.deflate jednoduchý

<?php
$original_text 
"Toto je test.\nToto je iba test.\nToto nie je dolezity string.\n";
echo 
"Povodny text je " strlen($original_text) . " znakov dlhy.\n";

$fp fopen('test.deflated''w');
/* Tu "6" indikuje komresny level 6 */
stream_filter_append($fp'zlib.deflate'STREAM_FILTER_WRITE6);
fwrite($fp$original_text);
fclose($fp);

echo 
"Komprimovany subor je " filesize('test.deflated') . " bytov dlhy.\n";

/* Generuje vystup:

Povodny text je 70 znakov dlhy.
Komprimovany subor je 56 bytov dlhy.

 */
?>

bzip2.compress a bzip2.decompress fungujú rovnakým spôsobom ako zlib filtre popísané vyššie. Filter bzip2.compress akceptuje až dva parameter dané ako prvky asociatívneho poľa: blocks je integer hodnota od 1 do 9 určujúca počet 100kbytových blokov pamäte na alokovanie pre workspace. work je tiež integer hodnota o rozsahu od 0 do 250 indukujúca koľko snahy treba vynaložiť pomocou normálnej kompresnej metódy pred prechodom na pomalšiu, ale spoľahlivejšiu metódu. Ladenie tohto parametra ovplyvňuje iba kompresnú rýchlosť. Ani veľkosť kompresného výstupu ani využitie pamäte nie sú týmto nastavením zmenené. Pracovný faktor 0 nariaďuje bzip knižnici použiť vnútorný default. Filter bzip2.decompress akceptuje iba jedej parameter, ktorý môže byť poslaný buď ako bežná hodnota boolean alebo ako prvok small asociatívneho poľa. small , ak je nastavený na TRUE hodnotu, nariaďuje bzip knižnici na vykonanie dekompresie v minimálnej tlačovej stope pamäte za cenu rýchlosti.

Note: Filtre bzip2.* nie sú momentálne zabudované do PHP jadra. Pre povolenie týchto filtrov v PHP 5, naištalujte balík » bz2_filter z » PECL. Tieto filtre nie sú dostupné pre PHP 4.

Example#3 bzip2.compress a bzip2.decompress

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

echo 
"Povodny subor je " filesize('LICENSE') . " bytov dlhy.\n";

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

echo 
"Komprimovany subor je " filesize('LICENSE.compressed') . "bytov dlhy.\n";

/* Generuje vystup:

Povodny text je 3288 znakov dlhy.
Komprimovany subor je 1488 bytov dlhy.

 */
?>