我正在尝试使用PHP解压缩14MB存档,其代码如下:
$zip = zip_open("c:\kosmas.zip");
while ($zip_entry = zip_read($zip)) {
$fp = fopen("c:/unzip/import.xml", "w");
if (zip_entry_open($zip, $zip_entry, "r")) {
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
fwrite($fp,"$buf");
zip_entry_close($zip_entry);
fclose($fp);
break;
}
zip_close($zip);
}
在本地主机上失败,内存限制为128MB,经典“Allowed memory size of blablabla bytes exhausted
”。在服务器上,我有16MB的限制,有没有更好的方法来做到这一点,以便我可以适应这个限制?我不明白为什么这需要分配超过128MB的内存。提前谢谢。
解决方案: 我开始用10Kb的块读取文件,问题解决了峰值内存使用率为1.5MB。
$filename = 'c:\kosmas.zip';
$archive = zip_open($filename);
while($entry = zip_read($archive)){
$size = zip_entry_filesize($entry);
$name = zip_entry_name($entry);
$unzipped = fopen('c:/unzip/'.$name,'wb');
while($size > 0){
$chunkSize = ($size > 10240) ? 10240 : $size;
$size -= $chunkSize;
$chunk = zip_entry_read($entry, $chunkSize);
if($chunk !== false) fwrite($unzipped, $chunk);
}
fclose($unzipped);
}
答案 0 :(得分:4)
为什么一次阅读整个文件?
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
fwrite($fp,"$buf");
尝试阅读它的小块并将它们写入文件。
答案 1 :(得分:1)
仅仅因为拉链小于PHP的内存限制&或许解压缩也是如此,一般不考虑PHP的开销,更重要的是实际解压缩文件所需的内存,虽然我不是压缩专家,但我期望它可能远远超过最终解压缩大小。
答案 2 :(得分:0)
对于那个大小的文件,如果你使用shell_exec()
代替它可能会更好:
shell_exec('unzip archive.zip -d /destination_path');
PHP必须不以安全模式运行,并且您必须能够访问shell_exec和解压缩才能使此方法生效。
<强>更新强>:
鉴于命令行工具不可用,我所能想到的只是创建一个脚本并将文件发送到命令行工具 可用的远程服务器,解压缩文件并下载内容。
答案 3 :(得分:0)
function my_unzip($full_pathname){
$unzipped_content = '';
$zd = gzopen($full_pathname, "r");
while ($zip_file = gzread($zd, 10000000)){
$unzipped_content.= $zip_file;
}
gzclose($zd);
return $unzipped_content;
}