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:
- 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.
- 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 mitob_get_level()abgefragt werden.
Syntax
ob_end_flush(): boolDie 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 mitob_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()odersetcookie()noch aufrufen, selbst nachdem Sie bereits Markup perechoausgegeben 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
| Funktion | Puffer senden? | Puffer offen lassen? | Inhalt zurückgeben? |
|---|---|---|---|
ob_end_flush() | Ja | Nein (schließt ihn) | Nein (gibt bool zurück) |
ob_get_flush() | Ja | Nein (schließt ihn) | Ja (gibt den String zurück) |
ob_flush() | Ja | Ja (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 browserAusgabe:
outer inner2Das 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
falsezurück und erzeugt einen Hinweis. Schützen Sie sich mitif (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()0ist, um jede Ebene abzubauen. - Verwechseln Sie es nicht mit
flush(). Das einfacheflush()ü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.