Я проверяю хорошие решения для архивирования потокового контента с S3, я сталкивался с ZipStream-PHP API, который был использован s3-ковшовый поток-молния PHP API, однако, я думаю, с помощью основного класса PHP ZipArchive, и его функция ZipArchive :: addFromString мы можем достичь того же.
Мой запрос ZipStream-PHP API является лучшим решением, чем ZipArchive для архивации потокового контента из S3 ИЛИ из какого-либо другого облачного сервиса?
Наилучшим решением из моего опыта является использование 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, посмотрите также и этот ответ: https://stackoverflow.com/a/44706446/136151
Других решений пока нет …