【问题标题】:Bulk Compress (Zip) files批量压缩 (Zip) 文件
【发布时间】:2014-04-19 18:45:51
【问题描述】:

使用: 我们的用户在我们的 AWS S3 账户中有很多对象。我们正在添加一项功能,可以一次下载整个项目。我们更关心效率而不是存储。

在查看了不同的选项(ZipArchive、PclZip)后,我发现this guide 推荐使用 Chilkat。

它的方法很有道理,总结如下:

  • 在上传时预压缩每个文件并将其存储在 S3 中
  • “项目下载”开始下载每个压缩文件,然后 QuickAppend(Chilkat 术语)“立即”(每个文件 200 毫秒)将它们添加到整个压缩文件中
  • 将新的 Zip 文件上传到 S3,提供链接

我遇到的问题是 Chilkat 的许可证是 249 美元,我正在寻找免费的替代品。

An alternative(也是免费的)使用了类似的概念:

  • 在上传时预压缩每个文件并将其存储在 S3 中
  • “项目下载”开始下载每个压缩文件,然后 tar 将它们放在一起
  • 将新的 Zip 文件上传到 S3,提供链接

是否有“标准”或“理想”的方式来处理这个问题?

【问题讨论】:

  • 是否可以在上传而不是下载时创建/更新项目 zip 文件?
  • 我提到的两种方法都可以做到这一点。
  • 不,您列出的方法在“项目下载”上运行 QuickAppendtar
  • 哦,你的意思是做整个事情?不,因为它在不断变化(包括删除项目),可能每分钟都在变化。每次重新创建一个是不切实际/效率低下的。

标签: php compression zip tar chilkat


【解决方案1】:

在我的本地系统上,PHP 的内置 zip 库能够在大约 800 毫秒内将 10 个文件 24MB zip 合并为 21 个文件 51MB zip,这与您报告的 200 毫秒/文件相当,但我不确定有多大您的文件是什么类型的硬件或您使用的是什么类型的硬件。

与您的指南作者最初使用的 Java 库不同,PHP 的 zip 库是用 C 实现的,因此您不会看到作者看到的从 Java 到 C 的相同性能提升。话虽如此,我不知道 Chillkat 的 QuickAppend 是如何工作的,或者它与 PHP 的 zip 库相比如何,但无论您使用 PHP 还是 Chillkat 都附加到预压缩文件似乎是最快的解决方案。

$destination = new ZipArchive;
$source = new ZipArchive;

if($source->open('a.zip') === TRUE 
&& $destination->open('b.zip') === TRUE) {

    $time_start = microtime(true);

    $temp_dir = "/tmp/zip_" . time();        
    mkdir($temp_dir,0777,true);
    $source->extractTo($temp_dir);
    $source->close();

    $files = scandir($temp_dir);
    $file_count = 0;

    foreach($files as $file) {
        if($file == '.' || $file == '..')
          continue;

        $destination->addFile("$temp_dir/$file");
        ++$file_count;
    }

    $destination->close();
    exec("rm -rf $temp_dir &");

    $time_end = microtime(true);
    $time = $time_end - $time_start;

    print "Added $file_count files in " . ($time * 1000). "ms \n";    
}

输出

-rw-rw-r-- 1 fuzzytree fuzzytree 24020997 Jun  4 15:57 a.zip
-rw-rw-r-- 1 fuzzytree fuzzytree 51418980 Jun  4 15:57 b.zip

fuzzytree@atlas:~/testzip$ php zip.php 
Added 10 files in 872.43795394897ms

fuzzytree@atlas:~/testzip$ ls -ltr *zip
-rw-rw-r-- 1 fuzzytree fuzzytree 24020997 Jun  4 15:57 a.zip
-rw-rw-r-- 1 fuzzytree fuzzytree 75443030 Jun  4 15:57 b.zip

【讨论】:

    【解决方案2】:

    我有一个网站,人们经常在一个 zip 文件中下载数十个甚至数百个文件(如果我不得不随便猜测的话,可能高达 100Mb)。我使用zipstream,我想我找到了here。我不确定这些限制,但它似乎运行良好,并且无需事先压缩单个文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多