W3docs

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 aktiven ob_start()-Puffer, der die Daten zurückhält.

Syntax

ob_implicit_flush(bool $enable = true): void

Parameter

ParameterTypBeschreibung
$enablebooltrue 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 und flush() aufrufen.
  • Ein aktiver ob_start()-Puffer überschreibt es. Wenn ein Puffer geöffnet ist, geht die Ausgabe zuerst dorthin. Beenden Sie ihn mit ob_end_flush() oder ob_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

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.

Übungen

Übung
Was bewirkt ob_implicit_flush(1) in PHP?
Was bewirkt ob_implicit_flush(1) in PHP?
Was this page helpful?