În timp ce învelișurile de compresie oferă o modalitate de a crea fișiere compatibile cu gzip and bz2 pe sistemul de fișiere local, ele nu oferă o modalitate de compresie generalizată prin fluxuri în rețea, nici nu oferă o modalitate de a începe cu un flux necomprimat și a trece la unul comprimat. Pentru acestea, un filtru de compresie poate fi aplicat oricând asupra oricărei resurse-flux.
Notă: Filtrele de compresie nu generează antete sau sfârșituri utilizate de utilitele din linie de comandă, cum ar fi gzip. Ele numai comprimă și decomprimă porțiunile cu încărcătură utilă a fluxurilor de date.
zlib.deflate (compresie) și
zlib.inflate (decompresie) sunt implementări ale metodelor de
compresie descrise în » RFC 1951.
Filtrul deflate preia până la trei parametri transmiși sub
forma unui tablou asociativ.
level
descrie nivelul de compresie utilizat (1-9).
Numere mai mari vor produce în general încărcături utile mai mici fără a necesita
timp de procesare suplimentar. De asemenea există și două nivele speciale de
compresie: 0 (fără compresie), și -1 (valoarea internă implicită a zlib -- în prezent 6).
window
este logaritmul în baza 2 a mărimii ferestrei de compresie
în buclă inversă. Valorile mai mari (până la 15 -- 32768 baiți) produc o compresie mai
bună, costul fiind mai multă memorie, în timp ce valorile mai mici (până la 9 -- 512 baiți)
produc o compresie mai rea într-un volum de memorie mai mic.
Valoarea implicită a mărimii window
este în prezent
15
.
memory
este o scară care indică ce volum de memorie de lucru trebiue
allocated. Valori permise sunt în intervalul de la 1 (alocare minimă) până la 9 (alocare maximă).
Aceată alocare de memorie influențează doar viteza și nu are impact asupra mărimii
încărcăturii de lucru generate.
Notă: Deoarece nivelul compresiei este cel mai des utilizat parametru, el poate fi transmis, îm mod alternativ, sub forma unei simple valori întregi (și nu sub forma unui tablou dintr-un element).
Filtrele de compresie zlib.* sunt disponibile în PHP începând cu versiunea 5.1.0, dacă susținerea zlib a fost activată. Ele de asemenea sunt disponibile în calitate de cod portabil și pentru versiunea 5.0.x instalând pachetul » zlib_filter din » PECL. Aceste filtre nu sunt disponibile pentru PHP 4.
Example #1 zlib.deflate și 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";
/* Folosim readfile și zlib.inflate pentru a decomprima datele 'din zbor' */
readfile('php://filter/zlib.inflate/resource=test.deflated');
/* Generează utmătoarele:
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.
*/
?>
Example #2 zlib.deflate simplu
<?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');
/* Aici "6" indică nivelul de compresie 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";
/* Generează următoarele:
The original text is 70 characters long.
The compressed file is 56 bytes long.
*/
?>
bzip2.compress și
bzip2.decompress
funcționează în același mod ca și filtrele zlib descrise anterior.
Filtrul bzip2.compress acceptă până la doi parametri transmiși sub
formă de elemente ale unui tablou asociativ:
blocks
este o valoare de tip întreg de la 1 până la 9, specificând
numărul de blocuri de memorie de 100 kbaiți pentru a fi alocați în spațiul de lucru.
work
este de asemenea o valoare de tip întreg din intervalul de la
0 până la 250 indicând ce volum de efort trebuie cheltuit folosind metoda normală de
compresie, înainte de a trece înapoi la o metodă mai lentă, dar mai sigură.
Reglarea acestui parametru afectează doar viteza de compresie. Nici mărimea datelor finale,
nici utilizarea memoriei nu sunt afectate de modificarea acestui parametru.
Valoarea 0 instruiește biblioteca bzip să utilizeze valoarea internă implicită.
Filtrul bzip2.decompress acceptă doar un parametru, care poate fi
transmis sub forma unei valori boolean obișnuite sau sub forma elementului
small
al unui tablou asociativ.
small
, când este stabilit la valoarea TRUE
, instruiește biblioteca
bzip să efectueze decomprimarea cu utilizarea unui volum minimal al memoriei la costul
vitezei de procesare.
Filtrele de copresie bzip2.* sunt disponibile în PHP începând cu versiunea 5.1.0 dacă susținerea bz2 a fost activată. Ele de asemenea sunt disponibile în calitate de cod portabil și pentru versiunea 5.0.x instalând pachetul » bz2_filter din » PECL. Aceste filtre nu sunt disponibile în PHP 4.
Example #3 bzip2.compress și 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";
/* Generează următoarele:
The original text is 3288 characters long.
The compressed file is 1488 bytes long.
*/
?>