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

2022-08-30 08:32:15

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

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

您会推荐哪对函数,为什么?

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

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


答案 1

所有这些都可以使用。这三者之间有细微的区别:

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

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

当压缩非常短的字符串时,每种方法的开销变得相关,因为对于非常短的输入,开销可以包含输出的很大一部分。通过压缩空字符串来度量的每种方法的开销为:

  • gzencode('')= 20 字节
  • gzcompress('')= 8 字节
  • gzdeflate('')= 2 字节

答案 2

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

DEFLATE是ZLIB,GZIP和其他公司使用的压缩算法的名称。从理论上讲,GZIP支持替代压缩算法,但实际上没有。

没有“GZIP算法”这样的东西。GZIP使用DEFLATE算法,并将框架数据放在压缩数据周围。使用GZIP,您可以添加文件名,文件时间,CRC甚至注释等内容。但是,此元数据是可选的,许多 gzipper 只是省略了它。

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

这一切都在 IETF RFC 195019511952 中

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


推荐