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:
- 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
.
- 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 (&
).
- 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.
- 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
}