PHP:gzdeflate在多台机器上安全吗?

时间:2013-02-22 11:02:53

标签: php compression gzip

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

  

gzcompress会生成更长的数据,因为它嵌入了有关的信息   编码到字符串上。如果要压缩数据   只有在一台机器上处理,那么你不必担心   关于您使用哪些功能。但是,如果你路过   将这些函数压缩到您应该使用的不同机器上的数据   使用gzcompress。

然后

  

在各种内容上运行50000次重复,我发现gzdeflate()   无论内容如何,​​gzcompress()都表现得同样快   压缩级别,但gzinflate()总是快两倍   gzuncompress()。

出于我的目的,我将数据存档在机器上以备将来使用。数据经常被读取,但只写一次。从理论上讲,如果我在某个时候改变服务器,有一天它会被转移到另一台机器上,但这是未来几年。

与gzcompress和gzuncompress相比,使用gzdeflate和gzinflate对我来说安全吗?

我的想法如下: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

1 个答案:

答案 0 :(得分:9)

评论是无稽之谈。您可以使用gzcompressgzdeflategzencode中的任何一个来生成可在任何位置进行可移植解压缩的压缩数据。这些函数仅在deflate数据(RFC 1951)的包装器中有所不同。 gzcompress有一个zlib包装器(RFC 1950),gzdeflate没有包装器,gzencode有一个gzip包装器(RFC 1952)。

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

从这个例子中我可能过度概括,但我会说你应该完全忽略PHP文档中的注释。他们是慷慨的,不知情的。

顺便说一下,这些功能以极其令人困惑的方式命名。只有gzencode名称中应包含“gz”,因为这是实际以.gz格式处理的唯一一个。 gzcompress听起来像压缩到gzip格式,但事实上它压缩为zlib格式。