W3docs

PHP ob_end_flush() Funktion: Alles, was Sie wissen müssen

Erfahren Sie, wie ob_end_flush() den Ausgabepuffer sendet und die Ausgabepufferung in PHP beendet – mit Beispielen und Hinweisen.

Wenn PHP die Ausgabe in einem Puffer erfasst, anstatt sie direkt an den Browser zu senden, muss dieser Puffer irgendwann freigegeben werden. Die Funktion ob_end_flush() tut genau das: Sie sendet den Inhalt des obersten Ausgabepuffers an die nächste Ebene (den Browser oder einen äußeren Puffer) und löscht diesen Puffer anschließend. Diese Seite erklärt, was die Funktion tut, wann man sie einsetzt, wie sie sich von verwandten Funktionen unterscheidet und welche Fallstricke es zu beachten gilt.

Was die ob_end_flush() Funktion tut

ob_end_flush() führt zwei Schritte am innersten (obersten) aktiven Ausgabepuffer aus:

  1. Sie leert den Puffer – sein Inhalt wird an den übergeordneten Puffer weitergegeben oder, wenn dies der letzte Puffer im Stapel war, direkt an den Client gesendet.
  2. Sie deaktiviert diesen Puffer und entfernt ihn vom Pufferstapel.

Bei Erfolg gibt die Funktion true zurück, bei false, wenn kein aktiver Puffer vorhanden ist (zum Beispiel, wenn sie zweimal aufgerufen wird oder ob_start() nie aufgerufen wurde). Bei einem Fehler wird außerdem ein E_NOTICE ausgegeben.

Puffer bilden einen Stapel. Jeder Aufruf von ob_start() legt einen neuen Puffer oben auf den Stapel. ob_end_flush() wirkt nur auf den aktuell obersten Puffer, nicht auf alle Puffer auf einmal. Die Anzahl der offenen Puffer kann mit ob_get_level() abgefragt werden.

Syntax

ob_end_flush(): bool

Die Funktion nimmt keine Argumente entgegen und gibt einen booleschen Wert zurück.

Einfaches Beispiel

<?php

ob_start();                       // start capturing output
echo "This will be buffered";     // goes into the buffer, not the screen yet
$ok = ob_end_flush();             // send the buffer out, then close it

var_dump($ok);                    // bool(true)

Ausgabe:

This will be bufferedbool(true)

ob_start() öffnet den Puffer, das echo landet darin, und ob_end_flush() gibt den Text an den Browser frei und beendet die Pufferung. Das var_dump() wird nach dem Entfernen des Puffers ausgeführt, daher wird seine Ausgabe direkt gesendet.

Wann würde ich das verwenden?

Die Ausgabepufferung ist besonders nützlich, wenn Sie spät entscheiden möchten, was mit bereits erzeugter Ausgabe geschehen soll:

  • Erfassen, dann prüfen oder ändern – einen Abschnitt puffern, ihn mit ob_get_contents() auslesen, optional umschreiben und dann mit ob_end_flush() das (möglicherweise geänderte) Ergebnis ausgeben.
  • Header nach der Ausgabe senden – da während der Pufferung nichts den Client erreicht, können Sie header() oder setcookie() noch aufrufen, selbst nachdem Sie bereits Markup per echo ausgegeben haben. ob_end_flush() gibt alles frei, sobald die Header festgelegt sind.
  • Verschachtelte Templates – einen inneren Puffer umschließen, ihn in einen äußeren Puffer leeren, der weitere Verarbeitungsschritte durchführt.

Wenn Sie den erfassten Text stattdessen in einer Variablen behalten möchten, ohne ihn zu senden, verwenden Sie ob_get_clean(). Wenn Sie die Ausgabe verwerfen möchten, verwenden Sie ob_end_clean().

ob_end_flush() vs. verwandte Funktionen

FunktionPuffer senden?Puffer offen lassen?Inhalt zurückgeben?
ob_end_flush()JaNein (schließt ihn)Nein (gibt bool zurück)
ob_get_flush()JaNein (schließt ihn)Ja (gibt den String zurück)
ob_flush()JaJa (bleibt offen)Nein
ob_end_clean()Nein (verwirft)Nein (schließt ihn)Nein

Eine einfache Merkhilfe: flush sendet, clean verwirft, get_ liefert zusätzlich den String, und end_ schließt den Puffer, anstatt ihn offen zu lassen.

Verschachtelte Puffer leeren

Da ob_end_flush() nur eine Ebene schließt, muss die Funktion einmal pro Puffer aufgerufen werden, um den gesamten Stapel abzubauen:

<?php

ob_start();                 // level 1
echo "outer ";

ob_start();                 // level 2
echo "inner";

echo ob_get_level();        // 2 — captured into level 2

ob_end_flush();             // level 2 flushes into level 1
ob_end_flush();             // level 1 flushes to the browser

Ausgabe:

outer inner2

Das innere echo und die Ebenenanzahl landen beide in Puffer 2; das erste ob_end_flush() fügt sie in Puffer 1 zusammen, und das zweite sendet alles an den Client.

Häufige Fallstricke

  • Ein Aufruf ohne aktiven Puffer gibt false zurück und erzeugt einen Hinweis. Schützen Sie sich mit if (ob_get_level() > 0), wenn nicht sicher ist, ob ein Puffer geöffnet ist.
  • Es wird nicht alles auf einmal geleert – ein Aufruf schließt genau einen Puffer. Wiederholen Sie die Schleife bis ob_get_level() 0 ist, um jede Ebene abzubauen.
  • Verwechseln Sie es nicht mit flush(). Das einfache flush() überträgt PHP/SAPI-Schreibpuffer an den Client, berührt aber den Ausgabepufferungsstapel nicht.

Fazit

ob_end_flush() sendet den aktuellen Ausgabepuffer an die nächste Ebene und schließt diesen Puffer anschließend. Verwenden Sie die Funktion, wenn Sie ob_start() zum Erfassen von Ausgabe eingesetzt haben und diese nun freigeben möchten. Denken Sie daran, dass Puffer einen Stapel bilden, dass die Funktion nur auf den obersten wirkt und dass die clean-/get_-Varianten die Alternativen für Verwerfen und Zurückgeben bieten.

Übungen

Übung
Was ist der Zweck der ob_end_flush() Funktion in PHP?
Was ist der Zweck der ob_end_flush() Funktion in PHP?
Was this page helpful?