Compression Filters
Compression Filters
Compression Filters
While the Compression Wrappers provide a way of creating
gzip and bz2 compatible files on the local filesystem, they do not
provide a means for generalized compression over network streams,
nor do they provide a means to begin with a non-compressed stream
and transition to a compressed one. For this, a compression filter
may be applied to any stream resource at any time.
Note: Compression filters do not
generate headers and trailers used by command line utilities such
as gzip. They only compress and decompress the payload
portions of compressed data streams.
zlib.deflate (compression) and
zlib.inflate (decompression) are implementations of the
compression methods described in » RFC 1951. The deflate
filter takes up to three parameters passed as an associative array.
level
describes the compression
strength to use (1-9). Higher numbers will generally yield smaller
payloads at the cost of additional processing time. Two special
compression levels also exist: 0 (for no compression at all), and
-1 (zlib internal default — currently 6). window
is the base-2 log of the compression
loopback window size. Higher values (up to 15 — 32768 bytes) yield
better compression at a cost of memory, while lower values (down to
9 — 512 bytes) yield worse compression in a smaller memory
footprint. Default window
size is
currently 15
. memory
is a scale indicating how much work
memory should be allocated. Valid values range from 1 (minimal
allocation) to 9 (maximum allocation). This memory allocation
affects speed only and does not impact the size of the generated
payload.
Note: Because compression level is the most commonly used
parameter, it may be alternatively provided as a simple integer
value (rather than an array element).
zlib.* compression filters are available with
PHP as of version 5.1.0 if zlib support is enabled. They are also available as a
backport in version 5.0.x by installing the » zlib_filter package from » PECL.
Example #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.
*/
?>
Example #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 and
bzip2.decompress work in the same manner as the zlib
filters described above. The bzip2.compress filter accepts
up to two parameters given as elements of an associative array:
blocks
is an integer value from 1 to
9 specifying the number of 100kbyte blocks of memory to allocate
for workspace. work
is also an
integer value ranging from 0 to 250 indicating how much effort to
expend using the normal compression method before falling back on a
slower, but more reliable method. Tuning this parameter effects
only compression speed. Neither size of compressed output nor
memory usage are changed by this setting. A work factor of 0
instructs the bzip library to use an internal default. The
bzip2.decompress filter only accepts one parameter, which
can be passed as either an ordinary boolean value, or as the
small
element of an associative
array. small
, when set to a
TRUE
value, instructs the bzip
library to perform decompression in a minimal memory footprint at
the cost of speed.
bzip2.* compression filters are available with
PHP as of version 5.1.0 if bz2 support is enabled. They are also available as a
backport in version 5.0.x by installing the » bz2_filter package from » PECL.
Example #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 text is 3288 characters long.
The compressed file is 1488 bytes long.
*/
?>