9

在 PHP 手册中有一条关于 gzdeflate 的评论说:

gzcompress 生成更长的数据,因为它将有关编码的信息嵌入到字符串中。如果您正在压缩只能在一台机器上处理的数据,那么您无需担心您使用这些功能中的哪一个。但是,如果您将使用这些函数压缩的数据传递到另一台机器,您应该使用 gzcompress。

进而

在各种内容上运行 50000 次重复,我发现 gzdeflate() 和 gzcompress() 无论内容和压缩级别都执行同样快,但 gzinflate() 总是大约是 gzuncompress() 的两倍。

出于我的目的,我将数据存档在机器上以备将来使用。数据经常被读取,但只写入一次。理论上,如果我在某个时候更换服务器,它总有一天会被转移到另一台机器上,但那是几年后的事了。

使用 gzdeflate 和 gzinflate 而不是 gzcompress 和 gzuncompress 对我来说安全吗?

我的想法如下:gzinflate 更快,这将对服务器有很大帮助,因为会有很多读取请求。如果将来某个时候我无法读取文件,那么我应该能够弄清楚如何解压缩文件并重新压缩它,对吗?并不是说 gzinflate 有一天会神奇地不起作用,就像第一条评论似乎在说的那样。即使缺少一个 6 字节的标头,我也确信它会以某种方式扩展。

想法?

更新——基准

每次 10,000 次迭代:

gzdeflate took 19.158888816833 seconds and size 18521
gzinflate took 1.4803981781006 seconds
gzcompress took 19.376484870911 seconds and size 18527
gzuncompress took 1.6339199542999 seconds
gzencode took 20.015944004059 seconds and size 18539
gzdecodetook 1.8822891712189 seconds
4

1 回答 1

11

评论是胡说八道。您可以使用 、 或 中的任何一个gzcompressgzdeflate生成gzencode可以在任何地方便携式解压缩的压缩数据。这些函数仅在 deflate 数据 (RFC 1951) 的包装器中有所不同。 gzcompress有一个 zlib 包装器 (RFC 1950),gzdeflate没有包装器,并且gzencode有一个 gzip 包装器 (RFC 1952)。

我建议不要使用gzdeflate,因为没有包装意味着没有完整性检查。 gzdeflate仅应在生成其他包装器时使用,例如,对于也使用 deflate 格式的 zip 文件。关于速度的评论几乎肯定是错误的。与解压相比,完整性检查gzuncompress()只需要很少的时间。你应该做你自己的测试。

从这个示例中,我可能过于笼统,但我想说您应该完全忽略 PHP 文档中的注释。他们是慷慨的,不知情的。

顺便说一句,这些函数的命名方式非常混乱。名称中只gzencode应包含“ gz”,因为这是唯一实际以该.gz格式进行交易的名称。 gzcompress听起来像是压缩成 gzip 格式,但实际上它压缩成 zlib 格式。

于 2013-02-22T16:07:39.983 回答