Heim >Backend-Entwicklung >PHP-Tutorial >Wie streame ich große Zip-Dateien auf dem LAMP-Stack für schnellere Downloads?

Wie streame ich große Zip-Dateien auf dem LAMP-Stack für schnellere Downloads?

Barbara Streisand
Barbara StreisandOriginal
2024-11-08 02:42:02682Durchsuche

How to Stream Large Zip Files on LAMP Stack for Faster 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 eine geeignete Puffergröße (z. B. 8192, wie von Benji in den Kommentaren vorgeschlagen).
  • Schalten Sie magische Anführungszeichen aus falls erforderlich.
  • Setzen Sie mb_http_output('pass') für optimale Leistung.
  • Verwenden Sie die entsprechenden inhaltsbezogenen Header:

    • Content-Type: application/zip
    • Inhaltsdisposition: Anhang; filename="file.zip"

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn