PHP gzcompress与gzopen/gzwrite

PHP gzcompress与gzopen/gzwrite,php,zlib,Php,Zlib,我正在编写一个生成gzip文件的PHP脚本。我一直使用的方法是在PHP中构建一个字符串,并在脚本末尾将其写入文件之前压缩该字符串 现在我正在用更大的文件测试我的脚本,并遇到内存分配错误。结果字符串似乎变得太大,无法一次性保存在内存中 为了解决这个问题,我尝试使用gzopen()和gzwrite()来避免在PHP中分配大字符串。但是,使用gzwrite()生成的gzip文件与使用gzcompress()时有很大不同。我尝试过不同的拉链级别,但没有帮助。我也尝试过使用gzdeflate(),结果与g

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

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

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


gzcompress()与PHP中的其他gzip函数有什么不同?有没有一种方法可以在增量生成结果的同时模拟gzcompress()的结果?

我曾经遇到过类似的问题-基本上没有足够的内存分配给php来完成这项业务


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

尝试增加php.ini文件中的memory\u limit参数

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

不过,这些都可能无关紧要。尝试使用gzip open/gzwrite创建一个gzip文件,然后使用命令行gzip程序将其解压缩。如果有效,那么使用gzopen/gzwrite将对您有效。

gzcompress()和gzopen()都使用DEFLATE方法压缩块。
但是它们有不同的头/尾。

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

如果您使用这些文件创建Zip文件,请注意默认的Mac Archive utility不接受此格式

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


如果对一个小文件/文本进行放气,生成一个放气块,并将其与用gzwrite编写的相同文本进行比较,您将看到两个差异,放气块头中的一个字节的差异为1,最后用上述字节填充。如果结果大于一个放气块,则差异开始累积。很难解决这个问题,因为deflate流块头甚至没有字节对齐。每个人都使用zlib是有原因的。很少有人敢尝试重写这种格式

我可能也会这样做,但这太不幸了。我是在Windows上开发的,但我的发布平台将是Linux,这会增加很多麻烦。关于不同的格式,你是对的,但我认为你是反其道而行之。据我所知,gzopen/gzwrite使用GZIP,gzcompress/decompress使用ZLIB。我还认为GZIP是ZLIB压缩数据的容器格式。不幸的是,我有一个用原始ZLIB压缩数据存储的文件,所以(在PHP中)没有一个真正有效的解决方案;我也遇到了同样的问题。。。有人知道吗?