PHP ob_implicit_flush() Funktion: Alles, was Sie wissen müssen
Erfahren Sie, wie die PHP-Funktion ob_implicit_flush() das implizite Leeren des Ausgabepuffers ein- und ausschaltet – mit Syntax und Beispielen.
Standardmäßig sammelt PHP alles, was Ihr Skript ausgibt, in einem internen Puffer und sendet es gebündelt an den Client. Implizites Flushen ändert dieses Verhalten: PHP sendet die Ausgabe nach jeder Ausgabeanweisung sofort an den Client, anstatt zu warten. Die Funktion ob_implicit_flush() ist der eingebaute Schalter, der dieses Verhalten ein- oder ausschaltet. Dieser Artikel behandelt Syntax, Parameter, Rückgabewert, praxisnahe Anwendungsfälle und häufige Fallstricke.
Was ist die ob_implicit_flush() Funktion?
Die Funktion ob_implicit_flush() schaltet das implizite Flushen für die aktuelle Ausgabepufferebene um. Wenn es aktiviert ist, verhält sich PHP so, als würde nach jedem echo, print, printf oder print_r automatisch ob_flush() aufgerufen – die Ausgabe wird sofort weitergegeben, anstatt zurückgehalten zu werden.
Dies ist besonders nützlich für lang laufende Skripte, bei denen der Benutzer den Fortschritt in Echtzeit sehen soll – beispielsweise ein Deployment-Log, ein CSV-Export oder ein Fortschrittsbalken – anstatt auf eine leere Seite zu starren, bis das gesamte Skript abgeschlossen ist.
Wichtig: Implizites Flushen betrifft nur PHPs eigenen Ausgabepuffer. Webserver wie Apache, Nginx und PHP-FPM haben ihre eigenen Puffer, ebenso wie der Browser. Um Bytes wirklich bis zum Benutzer zu übertragen, benötigen Sie in der Regel einen separaten
flush()-Aufruf und idealerweise keinen aktivenob_start()-Puffer, der die Daten zurückhält.
Syntax
ob_implicit_flush(bool $enable = true): voidParameter
| Parameter | Typ | Beschreibung |
|---|---|---|
$enable | bool | true schaltet implizites Flushen ein, false schaltet es aus. Standard ist true. |
Rückgabewert
In PHP 8.0 und höher gibt die Funktion void zurück. In PHP 7.x und früher gab sie den vorherigen Status des impliziten Flushens als bool zurück. Aufgrund dieser Änderung sollten Sie sich nicht auf den Rückgabewert in Code verlassen, der über mehrere Versionen hinweg laufen muss.
Verwendung der ob_implicit_flush() Funktion
Das übliche Muster besteht darin, PHPs regulären Puffer zu deaktivieren (oder zu beenden), implizites Flushen zu aktivieren und flush() aufzurufen, um den Serverpuffer zu umgehen:
<?php
// Turn off PHP's output buffering for this script so nothing is held back.
while (ob_get_level() > 0) {
ob_end_flush();
}
ob_implicit_flush(true);
for ($i = 1; $i <= 3; $i++) {
echo "Step {$i} done\n";
flush(); // defeat the web server buffer
sleep(1); // simulate slow work
}
echo "All steps finished\n";Jede Zeile erscheint im Browser ungefähr eine Sekunde nach der anderen, anstatt alle auf einmal am Ende. ob_implicit_flush(true) macht es überflüssig, nach jedem echo manuell ob_flush() aufzurufen, während flush() die Daten am eigenen Puffer des Webservers vorbeischickt.
Bei einem Kommandozeilenaufruf existieren die Pufferungsschichten oberhalb von PHP nicht, sodass die Ausgabe bereits Zeile für Zeile gestreamt wird – das macht die CLI zu einem guten Ort, um Ihre Logik zu überprüfen, bevor Sie hinter einem Webserver deployen.
Wann sollten Sie es verwenden?
- Streaming-Fortschrittsausgabe — Import-Jobs, Batch-Verarbeitung oder alles, bei dem eine Statuszeile pro Element die Verbindung aufrechthält und den Benutzer informiert.
- Server-Sent Events (SSE) — Echtzeit-Übertragung von
data:-Zeilen an den Browser. - Debugging von Pufferproblemen — Durch vorübergehendes Aktivieren können Sie genau sehen, wo die Ausgabe hängen bleibt.
Für normale Seiten möchten Sie implizites Flushen in der Regel nicht verwenden: Die Ausgabe in einem Block zu senden ist effizienter und ermöglicht es PHP, später im Skript noch Header zu setzen.
Häufige Fallstricke
- Es reicht allein nicht aus. Pufferung auf Serverebene (und
gzip/mod_deflate) kann Ihre Ausgabe trotzdem zurückhalten. Für die Echtzeit-Übertragung müssen Sie möglicherweise die Komprimierung deaktivieren undflush()aufrufen. - Ein aktiver
ob_start()-Puffer überschreibt es. Wenn ein Puffer geöffnet ist, geht die Ausgabe zuerst dorthin. Beenden Sie ihn mitob_end_flush()oderob_end_clean(), bevor Sie sich auf implizites Flushen verlassen. - Nach dem Flushen können keine Header mehr gesendet werden. Sobald eine Ausgabe geflusht wurde, schlagen
header()-Aufrufe mit „headers already sent" fehl.
Verwandte Funktionen
ob_start()— Startet einen neuen Ausgabepuffer.ob_flush()— Leert den aktuellen Puffer manuell.flush()— Leert die System-Schreibpuffer unterhalb von PHP.- PHP Output Control Übersicht — Die gesamte
ob_*-Familie auf einen Blick.
Fazit
Die Funktion ob_implicit_flush() bietet einen einfachen Schalter, damit PHP nach jeder Anweisung sofort Ausgaben sendet, anstatt sie zu puffern. Kombiniert mit flush() und einem Bewusstsein für serverseitige Puffer ermöglicht sie die Erstellung von Fortschrittsanzeigen und Streaming-Antworten für lang laufende Skripte. Für gewöhnliche Seiten lassen Sie es deaktiviert und überlassen PHP die gebündelte Ausgabe.