为什么PHP的gzuncompress()函数会出错?

Vla*_*aya 3 php gzip unzip

PHP有自己的功能来处理gzip档案.我写了以下代码:

error_reporting(E_ALL);
$f = file_get_contents('http://spiderbites.nytimes.com/sitemaps/www.nytimes.com/sitemap.xml.gz');
echo $f;
$f = gzuncompress($f);
echo "<hr>";
echo $f;
Run Code Online (Sandbox Code Playgroud)

第一个echo通常会输出带有正确标头的压缩文件(至少前两个字节是正确的).如果我用浏览器下载此文件,我可以轻松解压缩.

然而gzuncompress抛出 Warning: gzuncompress(): data error in /home/path/to/script.php on line 5

谁能指出我正确的方向来解决这个问题?

编辑:

phpinfo()输出的部分

在此输入图像描述

mar*_*rio 7

或者你可以使用正确的解压缩功能gzdecode().

  • @VladaKatlinskaya"gzuncompress"适用于所谓的"zlib"格式.而"gzdecode"解码gzip包装的数据.而"gzinflate"将只是原始的DEFLATE算法数据.基本上每个`gzdecode`>`gzuncompress`>`gzinflate`都会向流中添加更多的元数据. (4认同)

Gia*_*mPy 6

请注意,gzuncompress()可能无法解压缩某些压缩字符串并返回数据错误.

问题可能是外部压缩字符串在文件末尾有一个CRC32校验和,而不是像PHP期望的那样,而不是Adler-32.

(http://php.net/manual/en/function.gzuncompress.php#79042)

这可能是它不起作用的一种选择.

试试他的代码:

function gzuncompress_crc32($data) {
     $f = tempnam('/tmp', 'gz_fix');
     file_put_contents($f, "\x1f\x8b\x08\x00\x00\x00\x00\x00" . $data);
     return file_get_contents('compress.zlib://' . $f);
}
Run Code Online (Sandbox Code Playgroud)

修改你的代码:

error_reporting(E_ALL);
$f = file_get_contents('http://spiderbites.nytimes.com/sitemaps/www.nytimes.com/sitemap.xml.gz');
echo $f;
$f = gzuncompress_crc32($f);
echo "<hr>";
echo $f;
Run Code Online (Sandbox Code Playgroud)

据我在本地测试,它不再给出错误.