Rolf B: Verwirrung um PHP Output Buffer

Beitrag lesen

Hallo Vogl,

die Output-Buffer in PHP bilden einen Stapel. Mit ob_start wird eine neue Schicht auf diesen Stapel draufgelegt, und zum Entfernen dieser Schicht gibt's ein paar Varianten.

Eine Basisschicht ist immer da, die muss man nicht starten und die kann man auch nicht beenden. Das ist die „normale Ausgabe“, wo jeder echo direkt gesendet wird.

Üblicherweise entfernst Du eine Schicht mit ob_end_flush(), damit wird das, was in der aktuellen Schicht zwischengespeichert wurde, in darunter liegende Schicht kopiert und dann aktuelle Schicht X entfernt.

Aber das ist nicht unbedingt das, was Du willst. Deshalb gibt es Varianten, die sich darin unterscheiden, ob sie
(A) Die aktive Pufferschicht entfernen (beinhaltet automatisch B)
(B) Den aktuellen Inhalt des Puffers löschen
(C) Den aktuellen Inhalt des Puffers an die darunterliegende Schicht senden
(D) Den aktuellen Inhalt des Puffers als String zurückgeben

ob_end_flush()
Umfasst demnach C und A.
ob_end_clean()
A - entfernt einfach nur die oberste Schicht, ohne etwas auszugeben. Das machst Du dann, wenn Du „auf Verdacht“ etwas ausgegeben hast, weil Du nicht wusstest, ob Du überhaupt was ausgeben musst. Ich würde behaupten, dass man ob_end_clean jederzeit vermeiden kann, wenn man sein Programm etwas besser strukturiert.
ob_clean()
B - Entfernt die oberste Schicht nicht, aber leert ihren Inhalt. Das ist vermutlich die etwas fixere Alternative zu ob_end_clean(), direkt gefolgt von ob_start().
ob_flush()
C und B - Sendet den Pufferinhalt an die darunterliegende Schicht und löscht ihn dann. Der Puffer bleibt aktiv.
ob_get_clean()
D und A - Der Pufferinhalt wird Dir als String zurückgegeben und die aktuelle Pufferschicht entfernt.
ob_get_contents()
D - Du bekommst den aktuellen Pufferinhalt, aber der Puffer wird weder gelöscht noch entfernt.
ob_get_flush()
Hier bin ich nicht ganz sicher, aber es müsste D und C sein, gefolgt von A. Der Puffer wird ausgegeben und Du bekommst eine Kopie der Ausgabe als String. Danach wird der Puffer gelöscht.

Wenn ich nach ob_get_clean ein ob_end_clean setze, bekomme ich die Meldung
// Notice: ob_end_clean(): Failed to delete buffer. No buffer to delete

Das sollte jetzt verständlich sein. Beide Funktionen entfernen den obersten Puffer, und wenn Du nur einen gestartet hast, kannst Du auch nur einen entfernen.

Wie "drehe" ich nach ob_get_clean den Buffer also wieder "ab"?

Gar nicht. Die Funktion hat ihn schon abgedreht.

Rolf

--
sumpsi - posui - obstruxi