Компрессионные фильтры

В то время, как Компрессионные обертки обеспечивают способ создания gzip- и bz2-совместимых файлов в локальной файловой системе, они не предоставляют общих средств для компрессии в сетевых потоках, как и не предоставляют средств для создания потока без компрессии с последующим превращением в компрессируемый. Для этих целей к любым потоковым ресурсам в любое время могут применяться компрессионные фильтры.

Замечание: Компрессионные фильтры не генерируют заголовков и окончаний, которые используют утилиты командной строки, такие как gzip. Они просто компрессируют (сжимают) и декомпрессируют (разжимают) порции данных в компрессируемом потоке данных.

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 (максимальное резервирование). Такое резервирование памяти влияет только на скорость и не влияет на размер генерируемых данных.

Замечание: Так как уровень компрессии является наиболее часто используемым аргументом, вы можете передать только его в качестве обычного целого числа (integer), вместо того чтобы передавать массив из одного элемента.

Компрессионные фильтры zlib.* доступны с версии PHP 5.1.0, если включена поддержка zlib. Они так же доступны в качестве обратного порта для версий 5.0.x путем установки пакета » zlib_filter из » PECL.

Пример #1 zlib.deflate и 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 
"Оригинальный текст длиной " strlen($original_text) . " символов.\n";

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

echo 
"Сжатый файл размером " filesize('test.deflated') . " байт.\n";
echo 
"Оригинальный текст:\n";
/* Использование readfile и zlib.inflate для декомпресии на лету */
readfile('php://filter/zlib.inflate/resource=test.deflated');

/* Генерирует вывод:

Оригинальный текст длиной 70 символов.
Сжатый файл размером 56 байт.
Оригинальный текст:
This is a test.
This is only a test.
This is not an important string.

 */
?>

Пример #2 Упрощенное использование zlib.deflate

<?php
$original_text 
"This is a test.\nThis is only a test.\nThis is not an important string.\n";
echo 
"Оригинальный текст длиной " strlen($original_text) . " символов.\n";

$fp fopen('test.deflated''w');
/* Здесь "6" указывает уровень компрессии 6 */
stream_filter_append($fp'zlib.deflate'STREAM_FILTER_WRITE6);
fwrite($fp$original_text);
fclose($fp);

echo 
"Сжатый файл размером " filesize('test.deflated') . " байт.\n";

/* Генерирует вывод:

Оригинальный текст длиной 70 символов.
Сжатый файл размером 56 байт.

 */
?>

bzip2.compress и bzip2.decompress работают точно так же, как и фильтры zlib, описанные выше. Фильтр bzip2.compress принимает два аргумента в виде элементов ассоциативного массива: blocks является целочисленным (integer) значением в диапазоне от 1 до 9 и указывает на количество 100-килобайтовых блоков памяти для резервирования в качестве рабочего пространства. work - это так же целочисленное (integer) значение в диапазоне от 0 до 250, определяющее сколько усилий нужно потратить на обычный метод компрессии перед переключением на медленный, но более надежный метод. Изменение этого параметра влияет только на скорость компрессии. Ни размер сжатого результата, ни используемый объем памяти не изменяются при помощи этой настройки. Значение 0 указывает библиотеке bzip использовать собственное внутреннее значение по умолчанию. Фильтр bzip2.decompress принимает всего один аргумент, который может быть передан либо как обычное boolean-значение, либо как элемент small ассоциативного массива. Когда small установлен в TRUE, библиотека bzip совершит декомпрессию с минимальным расходом памяти за счет понижения скорости.

Компрессионные фильтры bzip2.* доступны с версии PHP 5.1.0, если включена поддержка bz2. Они так же доступны в качестве обратного порта для версий 5.0.x путем установки пакета » bz2_filter из » PECL.

Пример #3 bzip2.compress и bzip2.decompress

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

echo 
"Оригинальный файл размером " filesize('LICENSE') . " байт.\n";

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

echo 
"Сжатый файл размером " filesize('LICENSE.compressed') . " байт.\n";

/* Генерирует вывод:

Оригинальный файл размером 3288 байт.
Сжатый файл размером 1488 байт.

 */
?>

Коментарии

Автор:
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);
2015-08-21 21:12:18
http://php5.kiev.ua/manual/ru/filters.compression.html
Автор:
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.
2018-07-08 16:39:02
http://php5.kiev.ua/manual/ru/filters.compression.html
Автор:
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);
2021-02-10 20:37:02
http://php5.kiev.ua/manual/ru/filters.compression.html
Автор:
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.
2023-02-20 05:43:16
http://php5.kiev.ua/manual/ru/filters.compression.html

    Поддержать сайт на родительском проекте КГБ