使用PHP中的gzip解压缩大文件

Luk*_*kas 12 php gzip

我正在为我的文件使用一个简单的解压缩功能(如下所示),所以我不必在进一步处理之前手动解压缩文件.

function uncompress($srcName, $dstName) {
    $string = implode("", gzfile($srcName));
    $fp = fopen($dstName, "w");
    fwrite($fp, $string, strlen($string));
    fclose($fp);
} 
Run Code Online (Sandbox Code Playgroud)

问题是如果gzip文件很大(例如50mb),解压缩需要大量的ram来处理.

问题:我可以解析块中的gzip压缩文件并仍然得到正确的结果吗?或者是否有更好的其他方法来处理提取大型gzip文件的问题(即使它需要几秒钟)?

Pow*_*ord 43

gzfile()是一种调用gzopen,gzread和gzclose的便捷方法.

所以,是的,您可以手动执行gzopen并以块的形式gzread该文件.

这将以4kB块解压缩文件:

function uncompress($srcName, $dstName) {
    $sfp = gzopen($srcName, "rb");
    $fp = fopen($dstName, "w");

    while (!gzeof($sfp)) {
        $string = gzread($sfp, 4096);
        fwrite($fp, $string, strlen($string));
    }
    gzclose($sfp);
    fclose($fp);
}
Run Code Online (Sandbox Code Playgroud)

  • 我忘记了这个答案,直到最近有人对它进行了投票.我已经改变它来检查`gzeof`而不是盲目地依赖于`gzread`,*应该*修复上面提到的问题@maliayas.我应该添加一个检查以确保`$ sfp`或`$ fp`不要'=== FALSE`,但我很懒. (4认同)
  • 甜!测试1MB gzip文件,提取到48MB - 之前:处理时间:12.1447s,峰值内存使用:96512kB - 您的解决方案:处理时间:0.6705s,峰值内存使用:256kB谢谢:) (3认同)
  • `while($ string = gzread($ sfp,4096))`方法可能会导致这样的错误:如果返回的字符串是"0"`(包含"0"的文字字符串)那么它将评估为false并且下降走出while循环.太罕见的情况,但有一天可能会发生.一个更好的方法可能是'while(($ string = gzread($ sfp,4096))!='')`.在PHP中,`false =='0'`给出`true`但是'''=='0'给出'false`. (3认同)