使用: 我们的用户在AWS S3帐户中有许多对象。我们正在添加一个功能,可以立即下载整个项目。我们更关注效率而不是存储。
在查看了不同的选项(ZipArchive,PclZip)之后,我遇到this guide推荐使用Chilkat。
这种方法很有意义,总结如下:
我遇到的问题是Chilkat的许可证是249美元,我正在寻找免费替代品。
An alternative(也是免费的)使用了类似的概念:
有没有“标准”或“理想”的方式来解决这个问题?
答案 0 :(得分:2)
在我的本地系统上,PHP的内置zip库能够将大约24毫秒的10个文件压缩到一个21英寸的51MB压缩文件中,大约800毫秒,这与您报告的200毫秒/文件相当,但我和#39 ;我不确定你的文件有多大或者你正在使用什么类型的硬件。
与指南的作者最初使用的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
答案 1 :(得分:0)