PHP 核心 ZipArchive 与 ZipStream-PHP

Posted

技术标签:

【中文标题】PHP 核心 ZipArchive 与 ZipStream-PHP【英文标题】:PHP core ZipArchive versus ZipStream-PHP 【发布时间】:2016-09-04 13:26:16 【问题描述】:

我正在检查从 S3 压缩流内容的良好解决方案,我遇到了 ZipStream-php API,它已被 s3-bucket-stream-zip-php API 使用,但我猜在核心 PHP 类 ZipArchive 及其功能的帮助下ZipArchive::addFromString 我们可以达到同样的效果。

我的查询是 ZipStream-PHP API 是比 ZipArchive 更好的解决方案,用于从 S3 或任何其他云服务压缩流内容?

【问题讨论】:

如果有人反对,请在 cmets 中添加您的理由。 我试图就这个话题寻求帮助!如果有人可以根据他们的经验提出建议,那将会很有帮助! 刚看到这个,下面给你一个解决方案。 你得到你需要的答案了吗? @SukhjinderSingh 如果以下解决方案回答了您的问题,请将其标记为解决方案。 【参考方案1】:

根据我的经验,最好的解决方案是使用 aws-sdk-php 通过启用了 registerStreamWrapper() 的 s3client 访问 S3 上的对象。然后使用 fopen 从 S3 流式传输对象并将该流直接馈送到 ZipStream 的 addFileFromStream() 函数,并让 ZipStream 从那里获取它。没有 ZipArchive,没有大量内存开销,没有在服务器上创建 zip 或从 Web 服务器上的 S3 复制文件以随后用于流式传输 zip。

所以:

//...

$s3Client->registerStreamWrapper(); //required

//test files on s3
$s3keys = array(
  "ziptestfolder/file1.txt",
  "ziptestfolder/file2.txt"
);

// Define suitable options for ZipStream Archive.
$opt = array(
             'comment' => 'test zip file.',
             'content_type' => 'application/octet-stream'
            );

//initialise zipstream with output zip filename and options.
$zip = new ZipStream\ZipStream('test.zip', $opt);

//loop keys useful for multiple files
foreach ($s3keys as $key) 

       // Get the file name in S3 key so we can save it to the zip 
       //file using the same name.
       $fileName = basename($key);

       //concatenate s3path.
       $bucket = 'bucketname';
       $s3path = "s3://" . $bucket . "/" . $key;        

       //addFileFromStream
       if ($streamRead = fopen($s3path, 'r')) 
           $zip->addFileFromStream($fileName, $streamRead);        
        else 
           die('Could not open stream for reading');
       


$zip->finish();

如果您在 Symfony 控制器操作中使用 ZipStream,也请参阅此答案:https://***.com/a/44706446/136151

【讨论】:

以上是关于PHP 核心 ZipArchive 与 ZipStream-PHP的主要内容,如果未能解决你的问题,请参考以下文章

php ZipArchive 压缩整个文件夹 - 自带ZipArchive类 - PHP递归创建目录压缩包

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 && Linux下的ZipArchive配置开启压缩

启用 ZipArchive 的 Elastic Beanstalk 编译 php

如何在 php 7.4 上安装 ziparchive?

php ZipArchive压缩文件

PHP7中的ZipArchive找不到zip的内容