Heim > Artikel > Backend-Entwicklung > Wie streame ich Zip-Dateien dynamisch auf einem LAMP-Stack, ohne temporäre Dateien zu erstellen?
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!