PHP的Zlib模块提供了对gzip压缩文件的读写支持,可以与大多数文件系统函数一起使用,用于处理gzip压缩文件(以及未压缩的文件,但不支持与socket一起使用)。通过Zlib模块,可以轻松地对gzip压缩文件进行读写操作,实现文件的压缩和解压缩。本教程主要介绍如何在PHP中利用Zlib模块来处理gzip压缩文件。
一、安装
在 PHP 中,默认情况下未启用 Zlib 支持,需要通过配置 PHP 时使用 –with-zlib[=DIR] 来启用。对于 PHP 的 Windows 版本,已经内置支持这个扩展,不需要加载额外的扩展来使用 Zlib 函数。
运行时配置:
1、zlib.output_compression bool/int:是否以透明方式压缩页面。如果在 php.ini 或 Apache 配置中将此选项设置为 “On”,则在浏览器发送 “Accept-Encoding: gzip “或 “deflate “头信息时,页面将被压缩。”Content-Encoding:gzip”(分别为 “deflate”)和 “Vary: Accept-Encoding” 头信息会添加到输出中。在运行时,它只能在发送任何输出之前设置。该选项也接受整数值,而不是布尔值 “On”/”Off”,使用该值可以设置输出缓冲区大小(默认为 4KB)。
注意:如果设置为 “开”,output_handler 必须为空!必须使用 zlib.output_handler 代替。
2、zlib.output_compression_level int:用于透明输出压缩的压缩级别。指定一个介于 0(无压缩)到 9(最大压缩)之间的值。默认值为-1,由服务器决定使用哪个级别。
3、zlib.output_handler string:如果此处激活了 zlib.output_compression,则无法指定其他输出处理程序。此设置的作用与 output_handler 相同,但顺序不同。
二、预定义常量
列常量由此扩展定义,且仅在此扩展编译入 PHP 或在运行时动态载入时可用。
- FORCE_GZIP (int)
- FORCE_DEFLATE (int)
- ZLIB_ENCODING_RAW (int):DEFLATE 压缩算法,按照 RFC 1951 标准。
- ZLIB_ENCODING_DEFLATE (int):ZLIB 压缩算法,按照 RFC 1950 标准。
- ZLIB_ENCODING_GZIP (int):根据 RFC 1952 采用 GZIP 算法。
- ZLIB_FILTERED (int)
- ZLIB_HUFFMAN_ONLY (int)
- ZLIB_FIXED (int)
- ZLIB_RLE (int)
- ZLIB_DEFAULT_STRATEGY (int)
- ZLIB_BLOCK (int)
- ZLIB_NO_FLUSH (int)
- ZLIB_PARTIAL_FLUSH (int)
- ZLIB_SYNC_FLUSH (int)
- ZLIB_FULL_FLUSH (int)
- ZLIB_FINISH (int)
三、示例
本示例打开一个临时文件并向其中写入一个测试字符串,然后打印出该文件的内容两次。
<?php $filename = tempnam('/tmp', 'zlibtest') . '.gz'; echo "<html>\n<head></head>\n<body>\n<pre>\n"; $s = "Only a test, test, test, test, test, test, test, test!\n"; // open file for writing with maximum compression $zp = gzopen($filename, "w9"); // write string to file gzwrite($zp, $s); // close file gzclose($zp); // open file for reading $zp = gzopen($filename, "r"); // read 3 char echo gzread($zp, 3); // output until end of the file and close it. gzpassthru($zp); gzclose($zp); echo "\n"; // open file and print content (the 2nd time). if (readgzfile($filename) != strlen($s)) { echo "Error with zlib functions!"; } unlink($filename); echo "</pre>\n</body>\n</html>\n"; ?>
使用增量压缩和解压缩 API:
<?php // Perform GZIP compression: $deflateContext = deflate_init(ZLIB_ENCODING_GZIP); $compressed = deflate_add($deflateContext, "Data to compress", ZLIB_NO_FLUSH); $compressed .= deflate_add($deflateContext, ", more data", ZLIB_NO_FLUSH); $compressed .= deflate_add($deflateContext, ", and even more data!", ZLIB_FINISH); // Perform GZIP decompression: $inflateContext = inflate_init(ZLIB_ENCODING_GZIP); $uncompressed = inflate_add($inflateContext, $compressed, ZLIB_NO_FLUSH); $uncompressed .= inflate_add($inflateContext, NULL, ZLIB_FINISH); echo $uncompressed; ?>
以上示例会输出:
Data to compress, more data, and even more data!
四、Zlib函数
- deflate_add – 对数据进行增量解压缩。
- deflate_init – 初始化增量解压缩上下文。
- gzclose – 关闭打开的 gz 文件指针。
- gzcompress – 压缩字符串。
- gzdecode – 解码 gzip 压缩字符串。
- gzdeflate – 对字符串进行解压缩。
- gzencode – 创建 gzip 压缩字符串。
- gzeof – 在 gz 文件指针上测试 EOF。
- gzfile – 将整个 gz 文件读入数组。
- gzgetc – 从 gz 文件指针获取字符。
- gzgets – 从文件指针获取行。
- gzgetss – 从 gz 文件指针获取行并去除 HTML 标记。
- gzinflate – 放大已放空的字符串。
- gzopen – 打开 gz 文件。
- gzpassthru – 输出 gz 文件指针上的所有剩余数据。
- gzputs – 别名 gzwrite。
- gzread – 二进制安全 gz 文件读取。
- gzrewind – 后退 gz 文件指针的位置。
- gzseek – 在 gz 文件指针上搜索。
- gztell – 告诉 gz 文件指针的读/写位置。
- gzuncompress – 解压缩字符串。
- gzwrite – 二进制安全 gz 文件写入。
- inflate_add – 增量充气编码数据。
- inflate_get_read_len – 获取已读取的字节数。
- inflate_get_status – 获取解压缩状态。
- inflate_init – 初始化增量充气上下文。
- ob_gzhandler – ob_start 回调函数压缩输出缓冲区。
- readgzfile – 输出 gz 文件。
- zlib_decode – 解压缩任何原始/gzip/zlib 编码数据。
- zlib_encode – 使用指定的编码压缩数据。
- zlib_get_coding_type – 返回用于输出压缩的编码类型。
五、DeflateContext类
一个完全不透明的类,从 PHP 8.0.0 起取代 zlib.deflate 资源。
final class DeflateContext { }
六、InflateContext类
一个完全不透明的类,从 PHP 8.0.0 起取代 zlib.inflate 资源。
final class InflateContext { }