用PHP解压较大的文件
我试图用PHP解压14MB的归档文件,代码如下:用PHP解压较大的文件,php,unzip,Php,Unzip,我试图用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_fi
$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,经典的“允许的bla字节内存大小已耗尽”
。在服务器上,我有16MB的限制,有没有更好的方法来满足这个限制?我不明白为什么要分配超过128MB的内存。提前谢谢
解决方案:
我开始以10Kb的块读取文件,这一问题通过arnoud 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);
}
仅仅因为一个zip小于PHP的内存限制&也许解压也是如此,并没有考虑PHP的开销,更重要的是,实际解压文件所需的内存,虽然我不擅长压缩,但我预计可能比最终解压的大小大得多。对于这种大小的文件,如果您改用以下选项,可能会更好: PHP不能在安全模式下运行,并且您必须具有访问shell_exec和解压的权限才能使用此方法 更新:
鉴于命令行工具不可用,我所能想到的就是创建一个脚本并将文件发送到远程服务器,在那里可以使用命令行工具,提取文件并下载内容。为什么一次读取整个文件
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
fwrite($fp,"$buf");
尝试读取其中的小块内容并将其写入文件。zip文件的未压缩大小是多少?是否可以使用命令行工具?未压缩大小约为110MB。不幸的是,使用命令行不是一个选项。是的,但似乎总有一个替代方案,即我可以解压峰值内存使用率低于1MB的更大归档文件,我可以解析峰值内存使用率低于3MB的1.5GB xml文件,为什么zip文件不能有这样的替代方案…不幸的是,命令行工具被服务器禁用。@Anax这就是为什么PHP得到错误的包装。为什么生产应用程序需要运行命令行参数?这是很多PHP蠕虫的主要来源。这正是我所做的,如果有人感兴趣,我将在一分钟内发布解决方案。任何解释或推理都可能有助于理解这个问题。此外,这已经在4年前得到了回答。
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;
}
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;
}