W3docs

PHP Output-Control-Funktionen: Alles, was Sie wissen müssen

PHP Output Buffering und ob_*-Funktionen: ob_start, ob_get_clean, ob_end_flush, Callbacks und häufige Fallstricke – mit ausführbaren Beispielen.

Normalerweise wird jedes echo, print oder jedes HTML-Stück in einem PHP-Skript sofort an den Browser gesendet, sobald es ausgeführt wird. Output Buffering ermöglicht es Ihnen, diese Ausgabe abzufangen und stattdessen im Speicher (einem Buffer) zu halten, damit Sie sie später prüfen, bearbeiten, verwerfen oder senden können. PHPs Output-Control-Funktionen sind die integrierten Werkzeuge, die diesen Buffer verwalten.

Dieses Kapitel erklärt, was Output Buffering ist, warum es reale Probleme löst und wie jede ob_*-Funktion funktioniert – mit ausführbaren Beispielen.

Warum Output Buffering wichtig ist

Output Buffering ist mehr als eine Kuriosität. Es löst eine Reihe alltäglicher PHP-Probleme:

  • „Headers already sent"-Fehler vermeiden. In PHP müssen Sie header() und setcookie() vor jeglicher Ausgabe aufrufen, die den Browser erreicht. Puffern Sie die Ausgabe, können Sie nach dem Ausführen Ihrer Templates noch Header senden, da bisher nichts tatsächlich ausgegeben wurde. Siehe headers_sent().
  • Ausgabe als String erfassen. Ein Template rendern oder eine Datei einbinden und das Ergebnis als Variable speichern, anstatt es auszugeben – die Grundlage der meisten einfachen Template-Engines.
  • Die gesamte Seite nachbearbeiten. HTML minifizieren, Platzhalter ersetzen oder die Ausgabe (gzip) komprimieren – alles an einer Stelle, bevor sie gesendet wird.
  • Unerwünschte Ausgabe verwerfen. Stören de Ausgaben einer Drittanbieter-Bibliothek oder Debug-Ausgaben, die der Benutzer nicht sehen soll, entfernen.

Die Output-Control-Funktionen

Hier sind die Funktionen, die Sie am häufigsten verwenden werden. Sie alle arbeiten mit dem durch ob_start() gestarteten Buffer.

FunktionWas sie tut
ob_start()Startet einen neuen Output-Buffer. Die Aufzeichnung beginnt ab diesem Punkt.
ob_get_contents()Gibt den aktuellen Inhalt des Buffers zurück, ohne die Pufferung zu beenden.
ob_get_length()Gibt die Anzahl der aktuell im Buffer befindlichen Bytes zurück.
ob_get_level()Gibt die Verschachtelungstiefe zurück (wie viele Buffer gestapelt sind).
ob_clean()Leert den Buffer, hält die Pufferung jedoch aufrecht.
ob_get_clean()Gibt den Inhalt zurück und beendet den Buffer – eine häufig verwendete Kombination.
ob_end_clean()Verwirft den Buffer und beendet die Pufferung (gibt nichts zurück).
ob_flush() / ob_end_flush()Sendet den Buffer an den Browser; ob_end_flush() beendet auch die Pufferung.

Ausgabe als String erfassen

Die häufigste Verwendung der Pufferung besteht darin, alles, was ein Codeblock ausgibt, in einer Variable zu speichern. ob_get_clean() gibt den Buffer zurück und beendet die Pufferung in einem einzigen Aufruf:

php— editable, runs on the server

Nichts erreicht den Browser bis zum abschließenden echo, das HELLO, WORLD! ausgibt. Wir haben den Text erfasst, transformiert und erst dann gesendet. Genau so funktioniert eine einfache Template-Funktion:

<?php

function renderTemplate(string $name): string {
    ob_start();
    echo "Hello, $name!";
    return ob_get_clean();   // contents + stop buffering
}

echo renderTemplate("Ada");

Dies gibt Hello, Ada! aus. In einem echten Projekt würde der gepufferte Block ein vollständiges HTML-Template mit eingebetteten <?= $name ?>-Tags sein.

Den Buffer an den Browser senden

Wenn Sie die Ausgabe nur verzögern (nicht erfassen) möchten, verwenden Sie ob_end_flush(), um alles auf einmal zu senden:

php— editable, runs on the server

Während der Buffer geöffnet ist, können Sie ihn auch mit ob_get_length() und ob_get_level() prüfen:

<?php

ob_start();
echo "buffered text";
echo "\nLevel: " . ob_get_level();   // 1 — one buffer is active
echo "\nLength: " . ob_get_length(); // bytes captured so far
ob_end_flush();

ob_get_level() gibt 1 zurück, weil ein einziger Buffer aktiv ist; wenn Sie darin erneut ob_start() aufrufen, wird die Tiefe 2 (Buffer stapeln sich wie ein Stack).

Ausgabe mit einem Callback transformieren

ob_start() akzeptiert einen Callback, der den gesamten Buffer empfängt und die modifizierte Version zurückgibt. So funktionieren Ausgabe-Minifier und Such-und-Ersetzen-Filter:

<?php

ob_start(function (string $buffer): string {
    return str_replace("cat", "dog", $buffer);
});

echo "I have a cat.";
ob_end_flush();

Der Callback wird beim Leeren des Buffers ausgeführt, sodass die Seite I have a dog. ausgibt. Dasselbe Muster wird von ob_gzhandler verwendet, PHPs integriertem Callback zur gzip-Komprimierung der Ausgabe.

Fallstricke

  • Schließen Sie immer, was Sie öffnen. Jedes ob_start() sollte durch einen Flush- oder Clean-Aufruf abgeschlossen werden. Ein unausgeglichener Buffer lässt die Ausgabe im Speicher feststecken und erreicht den Benutzer nie.
  • Buffer verschachteln sich. Jedes ob_start() erhöht die Tiefe. ob_get_clean() schließt nur den innersten Buffer; verwenden Sie ob_get_level() in einer Schleife, wenn Sie mehrere abbauen müssen.
  • ob_get_contents() beendet die Pufferung nicht – nur *_clean- und *_end_*-Funktionen tun das. Diese zu verwechseln ist eine häufige Ursache doppelter Ausgaben.
  • Ein Buffer hat eine begrenzte Größe. Standardmäßig leert PHP den Buffer automatisch, sobald er output_buffering Bytes erreicht (php.ini), verlassen Sie sich daher nicht darauf, unbegrenzte Datenmengen zu halten.

Fazit

Output Buffering gibt Ihnen die Kontrolle darüber, wann und wie die Ausgabe Ihres Skripts gesendet wird. Verwenden Sie es, um gerenderte Inhalte als String zu erfassen, um Header nach dem Generieren einer Seite zu setzen, unerwünschte Ausgaben zu verwerfen oder die gesamte Antwort an einer Stelle nachzubearbeiten. Sobald Sie den Start/Get/Clean/Flush-Zyklus verstehen, ist die ob_*-Familie klein und vorhersehbar.

Weiterführende Lektüre: echo und print, PHP header(), PHP Sessions und PHP Cookies.

Übungen

Übung
Welche der folgenden Aussagen trifft auf PHP Output Control zu?
Welche der folgenden Aussagen trifft auf PHP Output Control zu?
Was this page helpful?