PHP ob_flush() Funktion: Alles, was Sie wissen müssen
Erfahren Sie, wie die PHP-Funktion ob_flush() den Ausgabepuffer sendet und geleert wird, ohne die Pufferung zu beenden – ideal für progressives Streaming.
Standardmäßig hält PHP Ihre Ausgabe in einem Puffer und sendet sie auf einmal an den Client. Manchmal möchten Sie das bisher Gesammelte an den Browser senden, ohne den Puffer zu beenden – zum Beispiel um einen langen Bericht zeilenweise zu streamen oder den Fortschritt während einer langsamen Aufgabe anzuzeigen. Die Funktion ob_flush() tut genau das: Sie sendet den Inhalt des aktiven Ausgabepuffers weiter und leert ihn anschließend, während die Pufferung aktiv bleibt, sodass Sie weiter Ausgaben sammeln können. Dieses Kapitel erklärt, wie ob_flush() in die PHP-Ausgabepufferungskette passt, wann Sie es einsetzen sollten und welche Fallstricke es gibt.
Was ob_flush() tut
ob_flush() sendet den Inhalt des obersten Ausgabepuffers an die nächste Ebene – den nächsten Puffer im Stack oder PHPs interne Schreibschicht, wenn dies der einzige Puffer ist. Nach dem Leeren wird der Puffer geleert, bleibt aber offen, sodass nachfolgende echo-Aufrufe wieder erfasst werden.
Signature: ob_flush(): void
Returns: nothing (void); emits a warning if no buffer is active
PHP: 4.0+ (return type became void in PHP 8.0)Zwei Konzepte werden leicht verwechselt:
ob_flush()bewegt Daten aus dem PHP-Puffer heraus, garantiert aber nicht, dass sie den Browser erreichen. Es kann noch einen weiteren Puffer darüber geben, sowie PHPs eigenen Schreibpuffer und den Puffer des Webservers.flush()schiebt PHPs Schreibpuffer in Richtung Client. Um tatsächlich Bytes zu übertragen, rufen Sie typischerweise beide in dieser Reihenfolge auf:ob_flush()und dannflush().
Sie muss mit ob_start() kombiniert werden. Das Aufrufen von ob_flush() ohne aktiven Puffer löst eine notice/warning aus und tut nichts.
Syntax
ob_flush();Sie nimmt keine Argumente entgegen und gibt keinen Wert zurück.
Einfaches Beispiel
Pufferung aktivieren, etwas schreiben und dann ausgeben:
<?php
ob_start(); // 1. Enable output buffering
echo "This will be buffered";
ob_flush(); // 2. Flush PHP buffer to the next level
flush(); // 3. Push it toward the clientAusgabe:
This will be bufferedob_start() öffnet einen Puffer, das echo wird darin erfasst, ob_flush() gibt diesen Text frei und flush() schiebt ihn in Richtung Browser. Entscheidend ist, dass der Puffer danach noch offen bleibt – Sie könnten erneut echo aufrufen und wieder leeren.
Ausgabe progressiv streamen
Die häufigste praktische Verwendung von ob_flush() ist das Senden von Ausgaben in Blöcken, sodass der Benutzer Ergebnisse sieht, sobald sie produziert werden, anstatt auf das Ende des gesamten Skripts zu warten:
<?php
ob_start();
for ($i = 1; $i <= 5; $i++) {
echo "Processing item $i\n";
ob_flush(); // hand this line to the next level
flush(); // and on toward the browser
// sleep(1); // (a real task would do work here)
}Ausgabe:
Processing item 1
Processing item 2
Processing item 3
Processing item 4
Processing item 5Auf einem Live-Server mit dem auskommentierten sleep(1) würde jede Zeile eine Sekunde später erscheinen, anstatt alle auf einmal am Ende.
ob_flush() vs. ob_end_flush() vs. ob_get_clean()
Die falsche „Flush"-Funktion zu wählen ist die häufigste Fehlerquelle. Sie unterscheiden sich in zwei Punkten: ob der Puffer offen bleibt und wohin der Inhalt geht.
| Funktion | Sendet Inhalt weiter? | Puffer bleibt offen? |
|---|---|---|
ob_flush() | Ja | Ja — Pufferung fortsetzen |
ob_end_flush() | Ja | Nein — schließt den Puffer |
ob_get_clean() | Nein — gibt ihn als string zurück | Nein — schließt den Puffer |
Verwenden Sie ob_flush(), wenn Sie Fortschritte ausgeben, aber weiter puffern möchten. Verwenden Sie ob_end_flush(), wenn Sie vollständig fertig sind. Verwenden Sie ob_get_clean(), wenn Sie den Puffer in eine Variable erfassen statt senden möchten.
Häufige Fallstricke
- Server-Pufferung kann Ausgaben weiterhin zurückhalten. Apache, Nginx (FastCGI-Pufferung), Gzip-Komprimierung und Proxys halten Ihre geleerten Bytes möglicherweise zurück, bis sie „genug" haben.
ob_flush()+flush()kontrollieren nur PHPs Seite. zlib.output_compressionunterbricht das Streaming. Wenn die Gzip-Ausgabekomprimierung aktiv ist, werden Zwischenflushes in der Regel für die Komprimierung gepuffert, sodass Blöcke nicht einzeln ankommen. Deaktivieren Sie es für Streaming-Endpunkte.- Kein Puffer = Warnung. Das Aufrufen von
ob_flush()ohne passendesob_start()löst eine Warnung aus. Prüfen Sie die aktive Ebene mitob_get_level(), wenn Sie unsicher sind. - Es leert den Puffer. Nach
ob_flush()wird der Puffer geleert, sodass Sie anschließend nicht mehr auf dessen vorherigen Inhalt zugreifen können. - Globales sofortiges Leeren erzwingen.
ob_implicit_flush(true)sorgt dafür, dass jede Ausgabeanweisung automatisch geleert wird, sodass nach jedemechokeinob_flush()mehr nötig ist.
Fazit
ob_flush() sendet den aktuellen Ausgabepuffer weiter, während die Pufferung aktiviert bleibt – damit ist es das richtige Werkzeug, um Fortschritte oder große Antworten schrittweise zu streamen. Denken Sie an die Kette: ob_start() öffnet den Puffer, ob_flush() gibt seinen Inhalt an die nächste Ebene weiter und flush() schiebt ihn in Richtung Client – und bedenken Sie, dass serverseitige Pufferung oder Gzip-Komprimierung die Auslieferung trotzdem verzögern können, unabhängig davon, was Ihr PHP-Code tut.