PHP 手册
后退 | 附录 M. 可用过滤器列表 | 前进

# 压缩过滤器

虽然压缩封装协议提供了在本地文件系统中 创建 gzip 和 bz2 兼容文件的方法，但不代表可以在网络的流中提供通用压缩的意思，也不代表可以将一个非压缩的流转换成一个压缩流。对此，压缩过滤器可以在任何时候应用于任何流资源。

> 注: 压缩过滤器不产生命令行工具如 gzip 的头和尾信息。只是压缩和解压数据流中的有效载荷部分。

zlib.deflate（压缩）和 zlib.inflate（解压）实现了定义与 RFC 1951 的压缩算法。deflate 过滤器可以接受以一个关联数组传递的最多三个参数。level 定义了压缩强度（1-9）。数字更高通常会产生更小的载荷，但要消耗更多的处理时间。存在两个特殊压缩等级：0（完全不压缩）和 -1（zlib 内部默认值，目前是 6）。window 是压缩回溯窗口大小，以二的次方表示。更高的值（大到 15 ―― 32768 字节）产生更好的压缩效果但消耗更多内存，低的值（低到 9 ―― 512 字节）产生产生较差的压缩效果但内存消耗低。目前默认的 window 大小是 `15`。memory 用来指示要分配多少工作内存。合法的数值范围是从 1（最小分配）到 9（最大分配）。内存分配仅影响速度，不会影响生成的载荷的大小。

> 注: 因为最常用的参数是压缩等级，也可以提供一个整数值作为此参数（而不用数组）。

zlib.* 压缩过滤器自 PHP 版本 5.1.0 起可用，在激活 zlib 的前提下。也可以通过安装来自 PECL 的 zlib_filter 包作为一个后门在 5.0.x 版中使用。此过滤器在 PHP 4 中不可用。

例子 M-7. 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 "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.
*/
?>`

例子 M-8. zlib.deflate 简单参数用法

`<?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 工作的方式与上面讲的 zlib 过滤器相同。bzip2.compress 过滤器接受以一个关联数组给出的最多两个参数：blocks 是从 1 到 9 的整数值，指定分配多少个 100K 字节的内存块作为工作区。work 是 0 到 250 的整数值，指定在退回到一个慢一些，但更可靠的算法之前做多少次常规压缩算法的尝试。调整此参数仅影响到速度，压缩输出和内存使用都不受此设置的影响。将此参数设为 0 指示 bzip 库使用内部默认算法。bzip2.decompress 过滤器仅接受一个参数，可以用普通的布尔值传递，或者用一个关联数组中的 small 单元传递。当 small 设为 `TRUE` 值时，指示 bzip 库用最小的内存占用来执行解压缩，代价是速度会慢一些。

bzip2.* 压缩过滤器自 PHP 版本 5.1.0 起可用，在激活 bz2 支持的前提下。也可以通过安装来自 PECL 的bz2_filter 包作为一个后门在 5.0.x 版中使用。此过滤器在 PHP 4 中不可用。

例子 M-9. bzip2.compress 和 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.
*/
?>`

后退 | 起点 | 前进
转换过滤器 | 上一级 | 加密过滤器