W3docs

PHP flush()-Funktion: Ausgabe sofort an den Browser senden

Lernen Sie, wie PHP flush() gepufferte Ausgabe sofort an den Browser sendet, wie es sich von ob_flush() unterscheidet und wann es sinnvoll einzusetzen ist.

Standardmäßig sammelt PHP den Text, den Ihr Skript ausgibt (mit echo, print usw.), und sendet ihn in Blöcken an den Browser – oft erst, wenn das Skript endet. Die eingebaute Funktion flush() ermöglicht es Ihnen, alles, was bereits erzeugt wurde, sofort weiterzuleiten, sodass der Benutzer eine teilweise Ausgabe sieht, bevor die Seite vollständig generiert ist. Diese Seite erklärt, was flush() tut, wie es sich von ob_flush() unterscheidet, welche Puffer zwischen Ihrem Skript und dem Browser liegen und wann der Einsatz tatsächlich sinnvoll ist.

Was die flush()-Funktion tut

flush(): void

flush() weist PHP an, alle gehaltenen Ausgaben an die darunter liegende Schicht weiterzugeben – den SAPI und den Webserver. Die Funktion nimmt keine Argumente entgegen und gibt nichts zurück. Ein häufiger Anwendungsfall ist ein lang laufendes Skript, das Fortschritt anzeigen soll (eine Logzeile, ein Zähler), anstatt den Benutzer vor einer leeren Seite warten zu lassen, bis alles abgeschlossen ist.

Zwei wichtige Einschränkungen:

  • flush() wirkt nicht auf die eigene Output-Buffering-Schicht von PHP (die mit ob_start() gestartet wird). Wenn Output Buffering aktiv ist, steckt der Text noch im PHP-Puffer und flush() hat nichts zu senden. Sie müssen diese Schicht zuerst mit ob_flush() oder ob_end_flush() freigeben.
  • flush() kann die Pufferung durch den Webserver oder Proxy nicht überschreiben (Apache mod_deflate, Nginx proxy_buffering, FastCGI, gzip). Diese können die Daten weiterhin zurückhalten, bis sie sich entscheiden, sie zu senden.

Ein einfaches Beispiel

Wenn kein PHP-Output-Buffering aktiv ist, reicht flush() allein aus, um die aktuelle Ausgabe weiterzuleiten:

<?php
echo "Starting a slow task...\n";
flush();        // send the line above to the browser now

sleep(2);       // pretend we are doing real work

echo "Done!\n";
?>

Ohne den flush()-Aufruf würden dem Benutzer typischerweise beide Zeilen nach 2 Sekunden gleichzeitig erscheinen. Mit ihm kann „Starting a slow task..." sofort ankommen.

flush() vs ob_flush()

Dies ist der Unterschied, der viele verwirrt. PHP kann zwei separate Puffer stapeln, und jede *flush-Funktion zielt auf einen anderen ab:

FunktionPuffer, den sie leert
ob_flush()PHPs Output-Control-Puffer (erstellt durch ob_start()) → verschiebt Daten in den SAPI-Puffer
flush()Den SAPI/Write-Puffer → leitet Daten weiter zum Browser

Wenn Output Buffering aktiv ist, benötigen Sie beide, in dieser Reihenfolge – zuerst ob_flush(), um PHPs Puffer freizugeben, dann flush(), um die Daten weiterzuschicken:

<?php
ob_start();             // turn on PHP output buffering
echo "Buffered text\n";

ob_flush();             // PHP buffer -> SAPI buffer
flush();                // SAPI buffer -> browser
?>

Kehren Sie die Reihenfolge um oder lassen Sie ob_flush() weg, bleibt der Text in PHP stecken. Wenn PHP nach jedem echo automatisch leeren soll, lesen Sie ob_implicit_flush().

Warum es oft „nicht funktioniert"

Streaming-Ausgabe zuverlässig umzusetzen ist schwieriger als eine Funktion aufzurufen, da mehrere Schichten unabhängig voneinander puffern:

  • gzip / Komprimierungzlib.output_compression und Apaches mod_deflate müssen genug Bytes sammeln, bevor sie senden. Deaktivieren Sie die Komprimierung für die Antwort, die Sie streamen möchten.
  • Webserver / Proxy-Pufferung – Nginx (proxy_buffering on), FastCGI und Load Balancer puffern die Antwort häufig erneut.
  • Browser-Rendering – Einige Browser warten auf eine Mindestanzahl von Bytes, bevor sie rendern; das Auffüllen der Ausgabe kann ein früheres Rendern erzwingen.

Aus diesen Gründen sollte flush() eher als Hinweis und nicht als Garantie betrachtet werden. Für moderne Streaming-Anforderungen (Server-Sent Events, Chunk-APIs) sollten Sie den Server explizit konfigurieren, anstatt sich allein auf flush() zu verlassen.

Verwandte Ausgabefunktionen

  • ob_flush() – PHPs Output-Control-Puffer leeren.
  • ob_end_flush() – Puffer leeren und Output Buffering beenden.
  • ob_get_flush() – Pufferinhalt zurückgeben und leeren.
  • PHP Output Control – Überblick darüber, wie die Pufferschichten zusammenwirken.
  • fflush() – Gepufferte Schreibvorgänge in eine offene Datei leeren (nicht den Browser).

Fazit

flush() zwingt PHP dazu, bereits erzeugte Ausgabe zum Browser zu senden, anstatt auf das Ende des Skripts zu warten. Denken Sie daran, dass es nur den SAPI/Write-Puffer betrifft: Wenn ob_start() aktiv ist, müssen Sie zuerst ob_flush() aufrufen, und selbst dann kann der Webserver oder die Komprimierungsschicht die Auslieferung verzögern. Mit diesem Verständnis eingesetzt, ist flush() eine praktische Möglichkeit, Fortschritte aus lang laufenden Skripten zu streamen.

Übungen

Übung
Was macht die PHP-Funktion flush()?
Was macht die PHP-Funktion flush()?
Was this page helpful?