PHP教程

PHP Zlib压缩

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 {
}
广告合作
QQ群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录