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

时间:2014-12-29 16:32:17

标签: 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;

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

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

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

修改

phpinfo()输出部分

enter image description here

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分: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);
}

修改您的代码:

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;

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