PHP gzcompress vs gzopen / gzwrite

时间:2009-07-13 01:43:32

标签: php zlib

我正在编写一个生成gzip压缩文件的PHP脚本。我一直在使用的方法是在PHP中构建一个字符串,然后在将字符串写入脚本末尾的文件之前使用gzcompress()字符串。

现在我正在用更大的文件测试我的脚本并遇到内存分配错误。似乎结果字符串变得太大而无法一次保存在内存中。

为了解决这个问题,我尝试使用gzopen()和gzwrite()来避免在PHP中分配大字符串。但是,使用gzwrite()生成的gzip压缩文件与使用gzcompress()时的gzip压缩文件非常不同。我已经尝试了不同的拉链级别,但它没有帮助。我也试过使用gzdeflate()并得到与gzwrite()相同的结果,但仍然与gzcompress()不相似。它不仅仅是前两个字节(zlib标题)不同,而是整个文件。

gzcompress()与PHP中的其他gzip函数有什么不同?有没有办法可以在逐步产生结果时模拟gzcompress()的结果?

5 个答案:

答案 0 :(得分:1)

主要区别在于gzwrite函数使用SYNC_FLUSH选项启动zlib,该选项将输出填充到4字节边界(或者是2),然后再加一点(0x00 0x00 0xff 0xff 0x03)。

如果您使用这些文件创建Zip文件,请注意默认的Mac存档实用程序不接受此格式。

据我所知,SYNC_FLUSH是一个gzip选项,不允许使用PKZip / Info-ZIP格式,所有.zip文件及其派生词都来自。

如果你缩小一个小文件/文本,产生一个deflate块,并将它与用gzwrite写的相同文本进行比较,你会看到2个差异,deflate块标题中的一个字节是不同的乘以1,并用上面的字节填充结尾。如果结果大于一个放气块,则差异开始堆积。很难解决这个问题,因为deflate流块头甚至不是字节对齐的。每个人都使用zlib是有原因的。很少有人敢于尝试重写这种格式!

答案 1 :(得分:0)

我遇到过类似的问题 - 基本上没有足够的ram分配给php来做生意。

我最终将字符串保存为文本文件,然后使用exec()使用文件系统gzip文件。它不是一个理想的解决方案,但它适用于我的情况。

答案 2 :(得分:0)

尝试增加php.ini文件中的memory_limit参数

答案 3 :(得分:0)

我不是100%肯定,但我的猜测是gzcompress使用GZIP格式,而gzopen / gzwrite使用ZLIB。老实说,我不能告诉你两者之间有什么区别,但我知道GZIP使用ZLIB进行实际压缩。

虽然这可能不重要。尝试使用gzopen / gzwrite创建一个gzip文件,然后使用命令行gzip程序对其进行解压缩。如果它有效,那么使用gzopen / gzwrite将对你有用。

答案 4 :(得分:0)

gzcompress()和gzopen()都使用DEFLATE方法来压缩块。 但他们有不同的标题/预告片。