在PHP中使用哪种压缩方法?

时间:2009-03-07 15:17:22

标签: php compression gzip

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

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

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

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

gzip格式(gzencode)旨在保留有关单个文件的目录信息,例如名称和上次修改日期。另一方面,zlib格式(gzcompress)是为内存和通信通道应用程序设计的,并且具有更紧凑的头和尾部,并且使用比gzip更快的完整性检查。

4 个答案:

答案 0 :(得分:79)

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

  • 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个字节

答案 1 :(得分:43)

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

DEFLATE是ZLIB,GZIP和其他人使用的压缩算法的名称。理论上,GZIP支持替代压缩算法,但在实践中,没有。

没有“GZIP算法”这样的东西。 GZIP使用DEFLATE算法,并在压缩数据周围放置成帧数据。使用GZIP,您可以添加文件名,文件时间,CRC,甚至评论等内容。但是,这个元数据是可选的,许多gzippers只是省略了它。

ZLIB类似,除了具有不同的,更有限的元数据集和特定的2字节头。

这一切都在IETF RFC 195019511952中。

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

答案 2 :(得分:6)

所有方法基本相同,它们之间的差异主要在标题中。我个人使用gzencode,这将产生的输出等于对gzip实用程序的命令行调用。

答案 3 :(得分:0)

我不得不用C ++在PHP中解压缩gzip压缩文件。 我发现PHP gzencode及其对应的gzdecode使用Z_NO_FLUSH方法,并在要编码/解码的数据块末尾应用Z_FINISH。 zlib网站上显示的C语言示例/教程可用于从PHP解压缩gzip文件,只要更改Windows位和内存级别以允许gzip压缩和膨胀即可。

额外:似乎该线程中的大多数人都不知道“压缩方法”的含义。