我正在为我的文件使用一个简单的解压缩功能(如下所示),所以我不必在进一步处理之前手动解压缩文件。
function uncompress($srcName, $dstName) {
$string = implode("", gzfile($srcName));
$fp = fopen($dstName, "w");
fwrite($fp, $string, strlen($string));
fclose($fp);
}
问题是如果gzip文件很大(例如50mb),解压缩需要大量的ram来处理。
问题:我可以解析块中的gzip压缩文件并仍然得到正确的结果吗?或者有更好的其他方法来处理提取大型gzip文件的问题(即使它需要几秒钟)?
答案 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解压缩。
作为旁注:
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;
}