用PHP解压较大的文件

用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

我试图用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,经典的“
允许的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;

}