Heim  >  Artikel  >  Backend-Entwicklung  >  Wie streame ich Zip-Dateien dynamisch auf einem LAMP-Stack, ohne temporäre Dateien zu erstellen?

Wie streame ich Zip-Dateien dynamisch auf einem LAMP-Stack, ohne temporäre Dateien zu erstellen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-07 14:42:03269Durchsuche

How to Stream Zip Files Dynamically on a LAMP Stack Without Creating Temporary Files?

So streamen Sie Zip-Dateien dynamisch auf einem LAMP-Stapel

Die Herausforderung

Archive erstellen Die schnelle Verarbeitung großer Dateien in einem Webdienst kann zu Leistungsproblemen und Ressourceneinschränkungen führen. Bei herkömmlichen Methoden werden temporäre ZIP-Dateien erstellt, was zu CPU-, Festplatten- und Speicheraufwand führt.

Streaming-Lösung mit popen() und Flush()

Um diese Nachteile zu vermeiden Erwägen Sie, die Erstellung der ZIP-Datei direkt an den Benutzer zu streamen. Dies kann mit popen() oder proc_open() erreicht werden, um einen Streaming-Pipeline-Befehl (z. B. zip) auszuführen. Die Kombination mit „flush()“ ermöglicht ein effizientes Streaming der ZIP-Datei während der Erstellung.

Überarbeitetes Beispiel

Hier ist ein aktualisiertes Codebeispiel, das einige aufgetretene Vorbehalte behebt von @Benji in den Kommentaren:

<?php
// Set headers
header('Content-Type: application/octet-stream');
header('Content-disposition: attachment; filename="file.zip"');
mb_http_output('pass');

// Execute pipeline command using popen()
$fp = popen('zip -r - file1 file2 file3', 'r');

// Initialize buffer
$bufsize = 8192;

// Stream zip file
while (!feof($fp)) {
    $buff = fread($fp, $bufsize);
    echo $buff;
}

// Close process
pclose($fp);

Hinweis: Obwohl Flush() ursprünglich empfohlen wurde, ist es ratsam, die Verwendung innerhalb der Schleife für große Dateien oder langsame Netzwerke zu vermeiden. Dies kann zu Pufferüberlaufproblemen führen.

Zusätzliche Überlegungen

Für Multiprozessorserver sollten Sie die Verwendung von nodeJS mit den Modulen http und child_process für eine effiziente, nicht blockierende I in Betracht ziehen /O.

Das Festlegen des Content-Length-Headers ist in diesem Szenario nicht möglich, da die Größe der ZIP-Datei vorher unbekannt ist. Erwägen Sie jedoch, zu untersuchen, ob Header vorhanden sind, die auf Streaming oder eine unbekannte Inhaltslänge hinweisen.

Das obige ist der detaillierte Inhalt vonWie streame ich Zip-Dateien dynamisch auf einem LAMP-Stack, ohne temporäre Dateien zu erstellen?. 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