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 and zlib.inflate

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.

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 and bzip2.decompress

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.

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.

 */
?>
add a note add a note

User Contributed Notes 4 notes

up
9
Anonymous
9 years ago
To read a gzip encoded stream from http
<?php
$opts
= [
   
"http" => [
       
"method" => "GET",
       
"header" => [ "Accept-Encoding: gzip" ],
    ]
];
$ctx = stream_context_create($opts);
$f = fopen("http://php.net", "r", false, $ctx);
// check  stream_get_meta_data($f)["wrapper_data"] has "Content-Encoding: gzip"
stream_filter_append($f, "zlib.inflate", STREAM_FILTER_READ, ["window" => 30]);
echo
stream_get_contents($f); // any stream processing
fclose($f);
up
1
Anonymous
3 years ago
To use the zlib.inflate filter with data originally written using gzcompress() or zlib.deflate, set the window option to 15 as outlined here: https://bugs.php.net/bug.php?id=68556

<?php
$fh
= fopen(file_name, 'rb');
stream_filter_append($fh, 'zlib.inflate', STREAM_FILTER_READ, ['window' => 15]);
$contents = stream_get_contents($fh);
fclose($fh);
up
2
bohwaz
6 years ago
Please note that there is currently a bug in this feature. ftell(), fseek() and fstat() functions cannot be used. Writing to a stream after using this function will not change the stream position as it should.

See bug: https://bugs.php.net/bug.php?id=49874

Also the zlib filters don't work with php://temp, php://memory and php://input streams, nothing is outputted to those streams.
up
-1
TingSong
1 year ago
To decompress a gzipped stream:

<?php
$stream
= fopen('https://example.com/some/file.txt.gz', 'rb');
stream_filter_append($stream, 'zlib.inflate', STREAM_FILTER_READ, ['window' => 15+16]);

// read the decompressed line directly
$line = fgets($stream);

// process the lines
?>

As the doc of zlib https://www.zlib.net/manual.html#Advanced

The 'window' parameter between 8 and 15 specified the window size from 2⁸ to 2¹⁵ bytes. It can be added by 16 for wrapping with gzip header and trailer instead of zlib wrapper.

And, window could be -8..-15 for unwrapping RAW deflate data.
To Top