Heim >Backend-Entwicklung >PHP-Tutorial >Wie streame ich große Zip-Dateien auf dem LAMP-Stack für schnellere Downloads?
Erstellen von On-the-Fly-ZIP-Dateien für große Dateien auf einem LAMP-Stapel
Problem:
Beim Erstellen von ZIP-Dateien mit mehreren großen Dateien zum Herunterladen durch den Benutzer führen herkömmliche Methoden in der Anfangsphase aufgrund der hohen CPU- und Festplattenauslastung zu erheblichen Leistungsproblemen.
Lösung mit Streaming:
Um dieses Problem zu lösen, können wir die Streaming-Funktionen von zip nutzen, indem wir popen() oder proc_open() verwenden, um die Zip-Befehlspipeline auszuführen und die Standardausgabe als PHP-Stream abzurufen. Durch die Kombination mit einem Webserverprozess können wir die ZIP-Datei an den Benutzer streamen, während sie im laufenden Betrieb erstellt wird.
Implementierung mit popen():
<?php // Set necessary headers header('Content-Type: application/zip'); header('Content-disposition: attachment; filename="file.zip"'); // Execute zip command and retrieve stdout as a stream $fp = popen('zip -r - file1 file2 file3', 'r'); // Read and echo data in chunks $bufsize = 65535; $buff = ''; while (!feof($fp)) { $buff = fread($fp, $bufsize); echo $buff; } pclose($fp); ?>
Tipps zur Optimierung:
Verwenden Sie die entsprechenden inhaltsbezogenen Header:
Leider ist es in diesem Zusammenhang nicht einfach, einen Header festzulegen, um Streaming oder unbekannte Inhaltslänge anzuzeigen.
Hinweis zu Flush():
Es ist wichtig zu beachten, dass der Aufruf von Flush() innerhalb der Lese-/Echo-Schleife zu Problemen mit großen Dateien und langsamen Netzwerken führen kann, da der interne Ausgabepuffer von Apache überläuft. Daher ist es am besten, Flush()-Aufrufe im Code wegzulassen.
Das obige ist der detaillierte Inhalt vonWie streame ich große Zip-Dateien auf dem LAMP-Stack für schnellere Downloads?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!