Start · Sprachen · PHP · Referenz · ob_implicit_flush

ob_implicit_flush

Funktion

Schaltet den impliziten Flush-Modus ein oder aus, sodass nach jeder Ausgabe automatisch <code>flush()</code> aufgerufen wird.

seit PHP 4.0.0 Kategorie: io

Signatur

ob_implicit_flush(bool $enable = true): void

Beschreibung

ob_implicit_flush() aktiviert oder deaktiviert den sogenannten impliziten Flush-Modus. Ist dieser Modus aktiviert, wird nach jedem Aufruf einer Ausgabefunktion (wie echo, print oder printf) automatisch ein flush() ausgeführt, das die Ausgabe sofort an den Client sendet, ohne auf das Ende des Skripts zu warten.

Dies ist besonders nützlich bei lang laufenden Skripten oder beim Streamen von Daten, wenn der Benutzer Fortschrittsmeldungen in Echtzeit sehen soll. Ein typischer Anwendungsfall sind CLI-Skripte oder Webseiten, die schrittweise aufgebaut werden sollen (z. B. während einer aufwändigen Datenverarbeitung).

Zu beachten ist, dass ob_implicit_flush() den PHP-internen Output-Buffer nicht deaktiviert. Wird ein aktiver Output-Buffer (via ob_start()) verwendet, so hat der implizite Flush keine direkte Wirkung auf den Browser, da der Buffer zuerst geleert werden muss. Es empfiehlt sich daher, vorhandene Output-Buffer mit ob_end_flush() zu schließen, bevor diese Funktion aktiviert wird.

Im Webserverkontext hängt die tatsächliche Wirkung auch von der Serverkonfiguration ab (z. B. aktiviertes gzip-Buffering beim Apache). Bei der Verwendung über die CLI ist der Effekt hingegen direkt spürbar.

Parameter

Name Typ Default Beschreibung
$enable bool true true aktiviert den impliziten Flush-Modus, false deaktiviert ihn wieder. Standardmäßig wird der Modus aktiviert.

Rückgabewert

Typ
void
Beschreibung
Diese Funktion gibt keinen Wert zurück.

Beispiele

Echtzeit-Fortschrittsanzeige im Browser

<?php
// Bestehende Output-Buffer schließen, damit der implizite Flush wirkt
while (ob_get_level() > 0) {
    ob_end_flush();
}

// Impliziten Flush-Modus aktivieren
ob_implicit_flush(true);

for ($i = 1; $i <= 5; $i++) {
    echo "Schritt $i von 5 wird verarbeitet...\n";
    // Simuliert eine aufwändige Operation
    sleep(1);
}

echo "Fertig!\n";
Schritt 1 von 5 wird verarbeitet... Schritt 2 von 5 wird verarbeitet... Schritt 3 von 5 wird verarbeitet... Schritt 4 von 5 wird verarbeitet... Schritt 5 von 5 wird verarbeitet... Fertig!

Impliziten Flush wieder deaktivieren

<?php
// Aktivieren
ob_implicit_flush(true);
echo "Dieser Text wird sofort gesendet.\n";

// Deaktivieren
ob_implicit_flush(false);
echo "Dieser Text wird erst am Skriptende gesendet.\n";

// Manueller Flush möglich
flush();
Dieser Text wird sofort gesendet. Dieser Text wird erst am Skriptende gesendet.

// Wichtig · Fallstricke

Webserver-Buffering: Viele Webserver (z. B. Apache mit mod_deflate/gzip) oder Reverse Proxies (z. B. nginx) puffern die Ausgabe unabhängig von PHP. In diesen Fällen kann ob_implicit_flush() alleine nicht das gewünschte Streaming-Verhalten erzielen. Die Serverkonfiguration muss entsprechend angepasst werden (z. B. X-Accel-Buffering: no bei nginx).

Output-Buffer-Konflikt: Ist ein aktiver Output-Buffer (via ob_start()) vorhanden, wird die Ausgabe trotz aktiviertem impliziten Flush zunächst im Buffer gehalten und nicht sofort an den Client gesendet. Alle aktiven Buffer sollten vor der Aktivierung des impliziten Flush mit ob_end_flush() geschlossen werden.

Veralteter Integer-Parameter: In älteren PHP-Versionen (vor PHP 8.0) akzeptierte die Funktion einen int-Wert (0 für deaktivieren, jeder andere Wert für aktivieren). Ab PHP 8.0 wird offiziell bool verwendet.