6

我正在尝试使用 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 块中的文件,使用峰值内存使用 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);
        }
4

4 回答 4

5

为什么要一次读取整个文件?

 $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
 fwrite($fp,"$buf");

尝试读取其中的一小部分并将它们写入文件。

于 2010-07-16T08:52:58.123 回答
1

仅仅因为 zip 小于 PHP 的内存限制,也许解压缩的也是如此,一般不考虑 PHP 的开销,更重要的是实际解压缩文件所需的内存,虽然我不是压缩专家,但我' d 期望可能比最终解压缩后的大小要多得多。

于 2010-07-16T08:33:52.160 回答
0

对于那个大小的文件,如果你使用它可能会更好shell_exec()

shell_exec('unzip archive.zip -d /destination_path');

PHP不得在安全模式下运行,并且您必须同时访问 shell_exec 和 unzip 才能使此方法起作用。

更新

鉴于命令行工具不可用,我所能想到的就是创建一个脚本并将文件发送到可以使用命令行工具的远程服务器提取文件并下载内容。

于 2010-07-16T08:35:31.780 回答
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;

}
于 2014-07-06T23:42:12.253 回答