标签 gzcompress 下的文章

PHP该用哪个压缩方法gzdeflate、gzcompress、gzencode

Gzip 是一种非常常见的压缩格式,PHP 也有一系列 gz 开头的函数用于操作 gzip 格式的压缩文件。然而令人困惑的是,同样是做压缩处理,却有着 gzdeflategzcompressgzencode 三个函数可用。那么它们都有着什么区别,平时又究竟应该用哪个呢?

这三个函数使用的压缩算法是一样的,都是 DEFLATE 压缩算法,三者的区别仅在于数据的封装格式不同。

  • gzdeflate 函数输出的是 DEFLATE 算法生成的原始数据,也被称作 RAW 格式的数据。由 RFC1951 定义
  • gzcompress 函数输出的是 zlib 格式的数据,它在 DEFLATE 生成的原始数据开头增加了两个字节的 header,末尾增加了四个字节的 ADLER-32 校验和。由 RFC1950 定义
  • gzencode 函数输出的是 gzip 格式,它是 gzip 工具定义的文件存储格式,理论上讲允许使用不同的压缩算法,但实际上目前只有 DEFLATE 一种实现。gzip 格式在 DEFLATE 生成的原始数据开头加入了一个至少10字节的变长header,末尾加入了固定8个字节的 tailer。由 RFC1952 定义

了解了三个函数的区别,就可以根据需要选择具体用哪个函数了。

  • gzdeflate 适用于可靠数据传输和存储环境下,需要减少数据量的情况。比如把数据压缩后存入 redis 或者 MySQL 的 blob 字段。
  • gzcompress 适用于需要处理 zlib 格式数据的场景。比如向 Accept-Encoding: deflate 的浏览器输出压缩的数据流。
  • gzencode 适用于需要被 gzip 工具解压的情况。比如把数据压缩并保存到 OSS 上,命名为 xxx.gz 的文件,允许用户下载后自行解压。

对了,PHP 还有一个 zlib_encode 函数,允许开发人员指定 $encoding 参数,它可以是 ZLIB_ENCODING_RAWZLIB_ENCODING_DEFLATE 或者 ZLIB_ENCODING_GZIP 三者之一,正好对应了 gzdeflategzcompressgzencode 三个函数的效果。如果读代码的人怕搞混,不妨考虑直接使用这个函数。