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

时间:2009-08-04 19:53:38

标签: php gzip

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

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

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

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

4 个答案:

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

答案 1 :(得分:1)

尝试

function uncompress($srcName, $dstName) {
    $fp = fopen($dstName, "w");
    fwrite($fp, implode("", gzfile($srcName)));
    fclose($fp);
}

$ length参数是可选的。

答案 2 :(得分:1)

如果您在Linux主机上,具有运行命令所需的特权,并且安装了gzip命令,您可以尝试使用类似shell_exec

的方法调用它

有点像这样,我想,会这样做:

shell_exec('gzip -d your_file.gz');

这样,文件就不会被PHP解压缩。


作为旁注:

  • 注意运行命令的位置(使用swith告诉“解压缩到那个目录”)
  • 你可能也想看看escapeshellarg; - )

答案 3 :(得分:0)

maliayas所述,可能会导致错误。我遇到了意外的while循环,但gz文件已成功解压缩。整个代码看起来像这样,对我来说效果更好:

function gzDecompressFile($srcName, $dstName) { 
    $error = false; 

    if( $file = gzopen($srcName, 'rb') ) { // open gz file

        $out_file = fopen($dstName, 'wb'); // open destination file

        while (($string = gzread($file, 4096)) != '') { // read 4kb at a time   
            if( !fwrite($out_file, $string) ) { // check if writing was successful
                 $error = true;
            }   
        }

        // close files
        fclose($out_file);
        gzclose($file);     

    } else {
        $error = true;
    }

    if ($error)
        return false; 
    else
        return true; 
}