2016-10-29 5 views
0

Mit dem Aufkommen von Diensten wie S3 für Objektspeicher, bekommt das alte Problem, benutzerdefinierte Zip-Archive dieser Dateien bereitzustellen, ein bisschen mehr kompliziert. Die offensichtliche Antwort ist, dass Ihr LAMP-Server alle Ressourcen in temporäre Dateien kopiert, sie in eine ZIP-Datei kompiliert und dann die ZIP an den Benutzer sendet, aber dies ist langsam und ressourcenintensiv.LAMP: Wie man .Zip aus entfernten URLs/Dateien erstellt und es fliessend auf den Client streamt

Kann dies analog zur solution for local files gemacht werden? in LAMP, können Sie einen Weg einrichten, dies z.B. von curl -ing die Dateien, Rohrleitung in zip im Streaming-Modus, und dann an den Benutzer, im laufenden Betrieb?

Antwort

0

Die Antwort ist ja - es kann prägnant und ohne kompliziertes Proc-Management durchgeführt werden. Der Schlüssel ist, dass zip wird nicht auf eine Reihe von Dateien, sondern eine Satz von fifo s arbeiten. Hier ist der Code:

$sh = 'mkfifo a.jpg b.jpg ; '.      // 1 
    'curl -s some_service.com/a.jpg > a.jpg & ' . // 2 
    'curl -s some_service.com/b.jpg > b.jpg & ' . // 
    'zip -FI - a.jpg b.jpg | cat > out.fifo';  // 3 

// Open output fifo & curl-zip task pipe 
posix_mkfifo('out.fifo', 0777);     // 4 
$pipe_output = popen('cat out.fifo', 'r');   // 
$pipe_curlzip = popen($sh, 'r');     // 

Es funktioniert wie folgt:

  1. Wir haben zwei Remote-Dateien: some_service.com/a.jpg und some_service.com/b.jpg - schaffen wir eine Fifo für jeden, die jeweils Fifo den Namen der entsprechenden Datei, wie wir mit Ich wünsche, dass es in unserer Zip-Datei erscheint. Für some_service.com/a.jpg erstellen wir einen Fifo namens a.jpg.
  2. Starten Sie zwei curl Aufgaben, um die Remote-Dateien a.jpg und b.jpg in die jeweilige Fifo zu füttern. Diese Curl-Aufgaben hängen so lange, bis etwas von ihren Ausgabe-Fifos gelesen wird, also führen wir sie im Hintergrund aus (&).
  3. Beginnen Sie unsere zip Aufgabe, geben Sie unsere zwei Fifos als Eingabe. Wir cat seine Streaming-Ausgabe in eine dritte fifo - out.fifo - um unseren PHP-Prozess zu ermöglichen, die Datei an den Benutzer zu streamen.
  4. Kick-offs.

Es ist dann nur eine Frage der Lektüre, was aus out.fifo kommt und es dem Benutzer zu senden:

header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="Download.zip"'); 

while (!feof($pipe_output)) { 
    echo fread($pipe_output, 128); // Your magic number here 
} 
Verwandte Themen