我有大量数据要使用两个 PHP 脚本移动:一个在客户端使用命令行 PHP 脚本,另一个在 Apache 后面。我将数据发布到服务器端并使用 php://input 流将其保存在网络服务器端。为了防止达到任何内存限制,每个 POST 请求的数据被分成 500kB 的 block 。这一切都很好。
现在,为了节省带宽并加快速度,我想在发送前压缩数据,并在另一端接收时解压缩。我找到了 3 对可以完成这项工作的函数,但我无法决定使用哪一个:
您会推荐哪对函数以及为什么?
更新:我刚刚阅读了 zlib 常见问题解答:
gzip 格式 (gzencode
) 旨在保留有关单个文件的目录信息,例如名称和最后修改日期。另一方面,zlib 格式 (gzcompress
) 是为内存和通信 channel 应用程序设计的,它具有更紧凑的标题和尾部,并且使用比 gzip 更快的完整性检查。
最佳答案
所有这些都可以使用。三者之间存在细微差别:
- gzencode()使用 GZIP 文件格式,与
gzip
命令行工具相同。此文件格式有一个包含可选元数据、DEFLATE 压缩数据的标题和包含 CRC32 校验和和长度检查的页脚。 - gzcompress()使用 ZLIB 格式。它有一个较短的 header ,仅用于识别压缩格式、DEFLATE 压缩数据和一个包含 ADLER32 校验和的页脚。
- gzdeflate()单独使用原始 DEFLATE 算法,这是其他两种格式的基础。
这三者都在后台使用相同的算法,因此它们的速度或效率不会有差异。 gzencode()
增加了包含原始文件名和其他环境数据的能力(当你只是压缩一个字符串时这是不使用的)。 gzencode()
和 gzcompress()
都添加了校验和,因此可以验证存档的完整性,这对于不可靠的传输和存储方法很有用。如果所有内容都存储在本地并且您不需要任何其他元数据,那么 gzdeflate()
就足够了。对于可移植性,我推荐 gzencode()
(GZIP 格式),它可能比其他工具中的 gzcompress()
(ZLIB 格式)得到更好的支持。
当压缩非常短的字符串时,每种方法的开销都变得相关,因为对于非常短的输入,开销可能占输出的很大一部分。每种方法的开销,通过压缩一个空字符串来衡量,是:
gzencode('')
= 20 字节gzcompress('')
= 8 字节gzdeflate('')
= 2 个字节
关于php - 在 PHP 中使用哪种压缩方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/621976/