繁体   English   中英

批量压缩(Zip)文件

[英]Bulk Compress (Zip) files

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

在查看了不同的选项(ZipArchive,PclZip)之后,我遇到了本指南,推荐使用Chilkat。

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

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

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

另一种 (也是免费的)使用类似的概念:

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

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

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

与本指南的作者最初使用的Java库不同,PHP的zip库是用C实现的,因此您不会看到与Java一样的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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM