76

我有大量数据要使用两个 PHP 脚本移动:一个在客户端使用命令行 PHP 脚本,另一个在 Apache 后面。我将数据发布到服务器端并使用 php://input 流将其保存在网络服务器端。为了防止达到任何内存限制,每个 POST 请求的数据被分成 500kB 的块。这一切都很好。

现在,为了节省带宽并加快速度,我想在发送前压缩数据并在另一端接收时解压缩。我找到了 3 对可以完成这项工作的函数,但我无法决定使用哪一个:

您会推荐哪对功能,为什么?

更新:我刚刚阅读了 zlib 常见问题解答:

gzip 格式 ( gzencode) 旨在保留有关单个文件的目录信息,例如名称和最后修改日期。gzcompress另一方面,zlib 格式(

4

3 回答 3

104

所有这些都可以使用。三者之间存在细微差别:

  • gzencode()使用 GZIP 文件格式,与gzip命令行工具相同。此文件格式有一个包含可选元数据、DEFLATE 压缩数据的标题和包含 CRC32 校验和和长度检查的页脚。
  • gzcompress()使用 ZLIB 格式。它有一个较短的标头,仅用于识别压缩格式、DEFLATE 压缩数据和一个包含 ADLER32 校验和的页脚。
  • gzdeflate()自己使用原始的 DEFLATE 算法,这是其他两种格式的基础。

这三者都在底层使用相同的算法,因此它们在速度或效率上不会有差异。 gzencode()添加了包含原始文件名和其他环境数据的功能(仅在压缩字符串时未使用)。 gzencode()并且gzcompress()两者都添加了校验和,因此可以验证存档的完整性,这对于不可靠的传输和存储方法很有用。如果所有内容都存储在本地并且您不需要任何其他元数据,那么gzdeflate()就足够了。对于可移植性,我推荐gzencode()(GZIP 格式),它可能比gzcompress()(ZLIB 格式)在其他工具中得到更好的支持。

当压缩非常短的字符串时,每种方法的开销变得相关,因为对于非常短的输入,开销可能包括输出的重要部分。每种方法的开销,通过压缩一个空字符串来衡量,是:

  • gzencode('')= 20 字节
  • gzcompress('')= 8 个字节
  • gzdeflate('')= 2 个字节
于 2009-03-07T15:24:43.330 回答
49

我不是 PHP 专家,无法回答提出的问题,但这里似乎有很多猜测,并且提供了模糊的信息。

DEFLATE 是 ZLIB、GZIP 等使用的压缩算法的名称。理论上,GZIP 支持替代压缩算法,但实际上,没有。

没有“GZIP 算法”之类的东西。GZIP 使用 DEFLATE 算法,并在压缩数据周围放置成帧数据。使用 GZIP,您可以添加文件名、文件时间、CRC 甚至注释等内容。不过,此元数据是可选的,许多 gzippers 只是省略了它。

ZLIB 与此类似,只是具有不同的、更有限的元数据集和特定的 2 字节标头。

这一切都在 IETF RFC 1950、19511952中。

说“gzip 算法比 DEFLATE 压缩得更好”纯属无稽之谈。没有gzip算法。GZIP 格式中使用的算法是 DEFLATE

于 2009-03-07T16:13:42.103 回答
7

所有方法本质上都是相同的,它们之间的区别主要在于标题。我个人会使用 gzencode,这将产生等于对 gzip 实用程序的命令行调用的输出。

于 2009-03-07T15:27:19.080 回答