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);Филтри за компресија
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Филтри за компресија
Референца за `filters.compression.php` со подобрена типографија и навигација.
Филтри за компресија
Додека Компресирани обвивки обезбедуваат начин за креирање датотеки компатибилни со gzip и bz2 на локалниот датотечен систем, тие не обезбедуваат средство за општа компресија преку мрежни потоци, ниту пак обезбедуваат средство за започнување со некомпресиран поток и преминување кон компресиран. За ова, филтер за компресија може да се примени на кој било ресурс од поток во секое време.
Забелешка: Филтрите за компресија прават not генерираат заглавја и опашки што ги користат комунални услуги од командната линија како што се
gzip. Тие само компресираат и декомпресираат делови од корисниот товар на компресирани потоци на податоци.
zlib.deflate и zlib.inflate
zlib.deflate (компресија) и
zlib.inflate (декомпресија) се имплементации на методите за компресија опишани во » RFC 1951ќе треба да се прилагоди, и deflate филтерот зема до три параметри предадени како асоцијативен низ.
level ја опишува јачината на компресија што треба да се користи (1-9). Поголемите броеви генерално ќе дадат помали корисни товари по цена на дополнително време за обработка. Постојат и две посебни нивоа на компресија: 0 (за никаква компресија) и -1 (внатрешна стандардна вредност на zlib -- моментално 6).
window е логаритам со основа 2 од големината на прозорецот за враќање на компресијата. Поголемите вредности (до 15 -- 32768 бајти) даваат подобра компресија по цена на меморијата, додека пониските вредности (до 9 -- 512 бајти) даваат полоша компресија со помал мемориски отпечаток. Стандардна window големината моментално е 15.
memory е скала што покажува колку работна меморија треба да се распредели. Валидните вредности се движат од 1 (минимална распределба) до 9 (максимална распределба). Оваа распределба на меморијата влијае само на брзината и не влијае на големината на генерираниот корисен товар.
Забелешка: Бидејќи нивото на компресија е најчесто користен параметар, тој може алтернативно да се обезбеди како едноставна целбројна вредност (наместо елемент од низа).
zlib.* филтрите за компресија се достапни ако zlib поддршката е овозможена.
Пример #1
zlib.deflate and
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";
/* Use readfile and zlib.inflate to decompress on the fly */
readfile('php://filter/zlib.inflate/resource=test.deflated');
/* Generates output:
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.
*/
?>Пример #2
zlib.deflate simple
<?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');
/* Here "6" indicates compression level 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";
/* Generates output:
The original text is 70 characters long.
The compressed file is 56 bytes long.
*/
?>bzip2.compress и bzip2.decompress
bzip2.compress and
bzip2.decompress
работат на ист начин како филтрите zlib опишани погоре. Филтерот bzip2.compress прифаќа до два параметри дадени како елементи на асоцијативен низ:
blocks е цел број од 1 до 9 што го специфицира бројот на блокови од 100 KB меморија за распределба за работен простор.
work е цел број од 1 до 9 што го специфицира бројот на блокови од 100 KB меморија за доделување за работниот простор. bzip2.decompress е исто така цел број во опсег од 0 до 250 што укажува колку напор да се вложи со користење на нормалниот метод на компресија пред да се врати на побавен, но посигурен метод. Подесувањето на овој параметар влијае само на брзината на компресија. Ниту големината на компресираниот излез, ниту употребата на меморија не се променети со оваа поставка. Фактор на работа од 0 го инструктира bzip библиотеката да користи внатрешна стандардна вредност. The
small филтерот прифаќа само еден параметар, кој може да се помине или како обична булова вредност, или како
smallелемент од асоцијативен низ. true , кога е поставен на
вредност, го инструктира bzip библиотеката да изврши декомпресија со минимален мемориски отпечаток по цена на брзината. bz2 поддршката е овозможена.
Пример #3
bzip2.compress and
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";
/* Generates output:
The original file is 3288 bytes long.
The compressed file is 1488 bytes long.
*/
?>Белешки од корисници 4 белешки
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.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 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);