2016-09-04 1 views
0

Ich überprüfe gute Lösungen für das Zippen Stream-Inhalte von S3, kam ich auf ZipStream-PHP API, die von s3-bucket-stream-zip-php API verwendet wurde, aber ich denke, mit Hilfe der Kern-PHP-Klasse ZipArchive, und seine Funktion ZipArchive::addFromString können wir das gleiche erreichen.PHP-Kern ZipArchiv versus ZipStream-PHP

Meine Abfrage ist ZipStream-PHP API ist eine bessere Lösung als ZipArchive zum Zippen Stream-Inhalte von S3 oder einem anderen Cloud-Service?

+0

Wenn jemand Abstimmung ist unten bitte auch Ihr Grund in Kommentare hinzufügen. –

+2

Ich habe versucht, Hilfe zu diesem Thema zu finden! Wäre hilfreich, wenn jemand aufgrund seiner Erfahrung vorschlagen könnte !! – jas

+0

Ich habe es gesehen und Ihnen eine Lösung gegeben. – Forer

Antwort

0

Die beste Lösung aus meiner Erfahrung ist die Verwendung von aws-sdk-php für den Zugriff auf Objekte in S3 über einen s3client mit aktiviertem registerStreamWrapper(). Verwenden Sie dann fopen, um Objekte aus S3 zu streamen, und leiten Sie diesen Stream direkt an die Funktion addFileFromStream() von ZipStream weiter, damit ZipStream sie von dort übernehmen kann. Kein ZipArchive, kein großer Speicheraufwand, kein Erstellen von ZIP auf dem Server oder Duplizieren von Dateien aus S3 auf dem Webserver, um anschließend eine Zip-Datei zu streamen.

So:

//... 

$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(); 

Und wenn Sie ZipStream in einem Symfony Controller-Aktion verwenden, diese Antwort sehen zu: https://stackoverflow.com/a/44706446/136151