PHP ядро ​​ZipArchive против ZipStream-PHP

Я проверяю хорошие решения для архивирования потокового контента из S3, я наткнулся на API- интерфейс ZipStream-PHP, который использовался API - интерфейсом https://github.com/jmathai/s3-bucket-stream-zip-php, однако, думаю, с помощью базового класса PHP ZipArchive и его Функция ZipArchive::addFromString позволяет добиться того же.

Мой запрос ZipStream-PHP API является лучшим решением, чем ZipArchive для архивации потокового контента из S3 ИЛИ какого-либо другого облачного сервиса?

1 ответ

Лучшее решение из моего опыта - использовать aws-sdk-php для доступа к объектам на S3 через s3client с включенной registerStreamWrapper(). Затем используйте fopen для потоковой передачи объектов из S3 и передачи этого потока непосредственно в функцию addFileFromStream() ZipStream, и пусть ZipStream возьмет его оттуда. Нет ZipArchive, нет больших затрат памяти, нет создания zip на сервере или дублирования файлов из 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();

И если вы используете ZipStream в действии контроллера Symfony, посмотрите также и этот ответ: /questions/17280319/ispolzovanie-zipstream-v-symfony-potokovaya-zagruzka-zip-ne-budet-raspakovyivatsya-s-pomoschyu-archive-utility-na-mac-osx/17280337#17280337

Другие вопросы по тегам