PHP ob_start()-Funktion: Alles, was Sie wissen müssen
Die PHP-Funktion ob_start() aktiviert das Output-Buffering, damit Sie Ausgaben vor dem Senden an den Client erfassen und transformieren können.
Wenn PHP ein Skript ausführt, wird jedes echo, print oder HTML-Block normalerweise sofort an den Client gesendet. Output-Buffering ändert das: Es hält alles, was das Skript ausgeben würde, in einem speicherinternen Puffer zurück, damit Sie es erfassen, ändern oder verwerfen können, bevor es den Server verlässt. Die Funktion ob_start() ist die eingebaute Funktion, die dieses Buffering aktiviert.
Dieses Kapitel erklärt, was ob_start() tut, seine Parameter, wie man Ausgaben erfasst und transformiert, die häufigsten realen Anwendungsfälle und die Fallstricke, über die man stolpert.
Was ist die ob_start()-Funktion?
ob_start() aktiviert das Output-Buffering. Während das Buffering aktiv ist, wird nichts, was das Skript ausgibt, an den Browser gesendet. Stattdessen sammelt es sich in einem internen Puffer an, bis Sie es explizit senden (flush), als String abrufen oder leeren.
Das Einzige, was Buffering nicht zurückhält, sind HTTP-Header. Da der Body nicht sofort gesendet wird, können Sie Funktionen wie header() noch nach bereits ausgegebenen Inhalten aufrufen — das ist der mit Abstand häufigste Grund, warum Entwickler zu ob_start() greifen.
Puffer lassen sich auch verschachteln: Jeder Aufruf von ob_start() legt einen neuen Puffer auf einen Stack, und die entsprechende Schließ-/Flush-Funktion entfernt den obersten. Mit ob_get_level() können Sie prüfen, wie tief der Stack ist.
Syntax
ob_start(
?callable $callback = null,
int $chunk_size = 0,
int $flags = PHP_OUTPUT_HANDLER_STDFLAGS
): boolParameter:
$callback— Optional. Eine Funktion, die den Pufferinhalt (und eine Status-Bitmask) empfängt und den tatsächlich auszugebenden String zurückgibt. Damit lässt sich alles transformieren, was das Skript ausgibt — zum Beispiel HTML minifizieren oder gzip-komprimieren.$chunk_size— Optional. Wenn größer als0, wird der Callback jedes Mal aufgerufen, wenn der Puffer diese Anzahl Bytes erreicht, anstatt nur beim Flushen des Puffers.0(Standard) bedeutet: nur beim Abschluss flushen.$flags— Optional. Eine Bitmask, die steuert, ob der Puffer geleert, geflusht und entfernt werden kann. Das Standard-PHP_OUTPUT_HANDLER_STDFLAGSerlaubt alle drei.
Rückgabewert: true bei Erfolg, false bei Fehler.
Grundlegende Verwendung: Ausgaben erfassen
Das häufigste Muster ist, einen Puffer zu starten, etwas auszugeben und es dann mit ob_get_clean() in eine Variable zu erfassen (was den Puffer zurückgibt und das Buffering in einem Schritt beendet):
<?php
ob_start(); // start buffering — nothing is sent yet
echo "Hello, ";
echo "world!";
$output = ob_get_clean(); // grab the buffer as a string, stop buffering
echo strtoupper($output); // now we control what actually gets sentAusgabe:
HELLO, WORLD!Hier erreichen die beiden echo-Aufrufe den Client nie direkt. ob_get_clean() gibt "Hello, world!" zurück, und nur die großgeschriebene Version wird schließlich ausgegeben. Dieser Ablauf „erfassen, dann transformieren" macht Buffering so mächtig.
Ausgaben mit einem Callback transformieren
Anstatt manuell zu erfassen, können Sie einen Callback an ob_start() übergeben. PHP führt ihn automatisch über den Puffer aus, wenn der Puffer geflusht wird (hier am Ende des Skripts):
<?php
function addBang(string $buffer): string
{
return str_replace("world", "World!", $buffer);
}
ob_start("addBang");
echo "hello world";
// buffer is flushed automatically at script end → callback runsAusgabe:
hello World!Genau so funktionieren eingebaute Handler wie ob_gzhandler() — übergeben Sie ihn als Callback, und Ihre gesamte Seite wird transparent gzip-komprimiert.
Häufige Anwendungsfälle
- Header nach der Ausgabe senden. Da der Body gepuffert wird, können Sie
header()odersetcookie()noch nach der HTML-Ausgabe aufrufen und vermeiden so die gefürchtete Warnung „headers already sent". Sieheheaders_sent(). - Templating. Den gerenderten HTML einer Template-Datei als String erfassen statt ihn direkt auszugeben, damit er zurückgegeben, gecacht oder in ein Layout eingebettet werden kann.
- Nachbearbeitung der gesamten Seite. HTML minifizieren, URLs umschreiben oder Kommentare über einen Callback entfernen, bevor irgendetwas gesendet wird.
- Komprimierung. Mit
ob_gzhandlerAntworten komprimieren, ohne dieecho-Aufrufe im Skript zu ändern.
Verwandte Funktionen
ob_start() wird selten allein verwendet. Diese Funktionen verwalten den damit erstellten Puffer:
ob_get_contents()— Gibt den Inhalt des Puffers ohne Leerung zurück.ob_get_clean()— Gibt den Puffer zurück und beendet das Buffering.ob_clean()— Verwirft den Pufferinhalt, lässt das Buffering aber aktiv.ob_end_flush()— Sendet den Puffer an den Client und beendet das Buffering.ob_end_clean()— Verwirft den Puffer und beendet das Buffering (sendet nichts).ob_get_level()— Gibt an, wie viele verschachtelte Puffer aktuell aktiv sind.
Für einen umfassenderen Überblick siehe PHP Output Control.
Häufige Fallstricke
- Schließen Sie immer, was Sie öffnen. Jedes
ob_start()muss durch einen Flush/Clean-Aufruf abgeschlossen werden. Ein nicht geschlossener Puffer wird am Skriptende automatisch geflusht, aber offene Puffer in langen Skripten können Ausgaben verbergen oder Speicher verschwenden. ob_get_clean()gibtfalsezurück, wenn kein Puffer aktiv ist. Ein Aufruf ohne passendesob_start()liefertfalse, nicht einen leeren String.- Buffering ≠ unbegrenzte Header. Header selbst werden nicht gepuffert; nur der Body wird es. Sobald ein Puffer an den Client geflusht wurde, sind die Header festgelegt.
Fazit
ob_start() aktiviert das Output-Buffering, damit PHP die Skriptausgabe im Speicher hält, anstatt sie sofort zu senden. Das ermöglicht das Erfassen von Ausgaben als String, deren Transformation mit einem Callback, das Senden von Headern nach der Ausgabe oder die Komprimierung einer gesamten Seite. Kombinieren Sie es mit ob_get_clean() zum Erfassen, ob_end_flush() zum Senden und ob_end_clean() zum Verwerfen — und denken Sie immer daran, jeden geöffneten Puffer zu schließen.