Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 大容量压缩(Zip)文件_Php_Compression_Zip_Tar_Chilkat - Fatal编程技术网

Php 大容量压缩(Zip)文件

Php 大容量压缩(Zip)文件,php,compression,zip,tar,chilkat,Php,Compression,Zip,Tar,Chilkat,使用: 我们的用户在AWS S3帐户中有许多对象。我们正在添加一个功能,可以一次下载整个项目。我们更关心的是效率而不是存储 在看了不同的选择(ZipArchive、PclZip)后,我发现我推荐使用Chilkat 它的方法很有意义,总结如下: 在上传时预压缩每个文件并将其存储在S3中 “项目下载”开始下载每个压缩文件,然后QuickAppend(Chilkat术语),然后“立即”(每个文件200毫秒)将其添加到整个压缩文件中 将新Zip文件上载到S3,提供链接 我遇到的问题是Chilkat的

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

在看了不同的选择(ZipArchive、PclZip)后,我发现我推荐使用Chilkat

它的方法很有意义,总结如下:

  • 在上传时预压缩每个文件并将其存储在S3中
  • “项目下载”开始下载每个压缩文件,然后QuickAppend(Chilkat术语),然后“立即”(每个文件200毫秒)将其添加到整个压缩文件中
  • 将新Zip文件上载到S3,提供链接
我遇到的问题是Chilkat的许可证是249美元,我正在寻找免费的替代品

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

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

有没有一种“标准”或“理想”的方法来处理这个问题?

我有一个网站,人们经常在一个zip文件中下载数十个甚至数百个文件(如果我不得不随便猜的话,多达100Mb)。我用我认为我找到的东西。我不确定它的局限性,但它似乎工作得很好,不需要事先压缩单个文件。

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

与指南作者最初使用的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

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