Forum und email

Filtrele de compresie

Î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 masiv 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 masiv 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_WRITE6);
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 masiv 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 masiv 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($fpfile_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.

 */
?>