PHP ob_clean() Funktion: Alles, was Sie wissen müssen
Die PHP-Funktion ob_clean() löscht den Inhalt des aktuellen Ausgabepuffers, ohne die Pufferung zu beenden. Syntax, Beispiele und häufige Fehler.
Die PHP-Funktion ob_clean() verwirft alles, was in den aktuellen Ausgabepuffer geschrieben wurde, ohne die Pufferung zu beenden. Sie wird verwendet, wenn das Skript bereits Ausgabe erzeugt hat, diese Ausgabe aber fehlerhaft ist (z. B. ein übrig gebliebenes Debug-var_dump, ein halb gerendertes Template oder eine Fehlermeldung), und Sie sie verwerfen und weiter neue Inhalte erzeugen möchten.
Diese Seite erklärt, was ob_clean() tut, zeigt die Signatur und den Rückgabewert, beschreibt häufige Fallstricke (insbesondere den Unterschied zu ob_end_clean()) und stellt praktische Einsatzmuster vor.
Was Ausgabepufferung ist
Normalerweise sendet PHP die Ausgabe sofort an den Client, sobald Sie echo aufrufen. Ausgabepufferung ändert das: Nachdem Sie ob_start() aufgerufen haben, wird alles, was Sie ausgeben, in einem In-Memory-Puffer gespeichert, anstatt sofort gesendet zu werden. Nichts verlässt PHP, bis Sie den Puffer leeren oder das Skript endet.
Diese Verzögerung macht die Pufferung nützlich – solange sich die Ausgabe im Puffer befindet, können Sie noch:
- HTTP-Header senden oder ändern (
header(),setcookie()), selbst nach dem Ausgeben von Text, - die erfasste Ausgabe inspizieren, umschreiben oder verwerfen,
- die gesamte Antwort komprimieren, bevor sie gesendet wird.
ob_clean() ist die „Verwerfen"-Operation in dieser Liste.
Syntax
ob_clean(): bool- Parameter: keine.
- Rückgabewert:
truebei Erfolg,falsebei Fehler. Ein Fehler tritt auf (mit einem Hinweis/einer Warnung), wenn kein aktiver Ausgabepuffer zum Leeren vorhanden ist.
Ein einfaches Beispiel
<?php
ob_start(); // start buffering
echo "This text is buffered.\n";
ob_clean(); // throw the buffered text away
echo "Only this line is shown.\n";
ob_end_flush(); // send remaining buffer to outputAusgabe:
Only this line is shown.Das erste echo wurde in den Puffer geschrieben, ob_clean() hat ihn geleert, und nur das zweite echo blieb erhalten. Beachten Sie, dass die Pufferung nach ob_clean() weiterhin aktiv ist – deshalb ist das abschließende ob_end_flush() nötig, um die zweite Zeile tatsächlich auszugeben.
Ein praxisnaher Anwendungsfall: einen fehlerhaften Render verwerfen
ob_clean() ist besonders nützlich, wenn Sie die Ausgabe optimistisch erzeugen und dann auf eine Bedingung stoßen, die sie ungültig macht:
<?php
function renderUser(?array $user): string
{
ob_start();
echo "<div class='card'>";
echo " <h2>" . ($user['name'] ?? '') . "</h2>";
if (empty($user)) {
ob_clean(); // scrap the half-built card
echo "<p>User not found.</p>"; // start fresh
return ob_get_clean();
}
echo "</div>";
return ob_get_clean();
}
echo renderUser(null); // <p>User not found.</p>
echo "\n";
echo renderUser(['name' => 'Ann']);Ausgabe:
<p>User not found.</p>
<div class='card'> <h2>Ann</h2></div>Hier gibt ob_get_clean() den Pufferinhalt zurück und beendet die Pufferung in einem Schritt, während ob_clean() mitten im Render verwendet wird, um das teilweise aufgebaute Markup zu verwerfen.
ob_clean() im Vergleich zu verwandten Funktionen
Die Ausgabesteuerungs-Familie hat vier ähnlich klingende Namen. Die zwei Dimensionen sind: Werden die Daten zurückgegeben? und Bleibt der Puffer offen?
| Funktion | Gibt Daten zurück? | Puffer bleibt offen? | Sendet Daten an Client? |
|---|---|---|---|
ob_clean() | nein (verwirft) | ja | nein |
ob_end_clean() | nein (verwirft) | nein | nein |
ob_get_clean() | ja | nein | nein |
ob_flush() | nein | ja | ja (sendet, verwirft nicht) |
Ein häufiger Fehler ist, ob_end_clean() zu verwenden, wenn ob_clean() gemeint war: Ersteres schließt die Pufferebene, sodass ein späteres echo nicht mehr gepuffert wird und nachfolgende ob_*-Aufrufe warnen können, dass kein Puffer aktiv ist.
Fallstricke
- Pufferung muss aktiv sein.
ob_clean()ohne vorangehendesob_start()gibtfalsezurück und erzeugt einen Hinweis. Prüfen Sie mitob_get_level(), falls Sie unsicher sind:if (ob_get_level() > 0) { ob_clean(); }. - Es wird nur der oberste Puffer geleert. Puffer können verschachtelt sein.
ob_clean()wirkt auf den innersten (zuletzt gestarteten) Puffer, nicht auf alle. - Header werden nicht zurückgesetzt.
ob_clean()leert nur den Ausgabetext; bereits mitheader()gesetzte Header sind davon unberührt.
Fazit
ob_clean() verwirft den Inhalt des aktuellen Ausgabepuffers, lässt die Pufferung dabei aber aktiv, und ist damit das richtige Werkzeug, wenn Sie bereits erzeugte Ausgabe verwerfen und mit einem leeren Zustand weiterarbeiten möchten. Denken Sie an den Unterschied zu ob_end_clean() (das auch den Puffer schließt) und zu ob_get_clean() (das den Inhalt an Sie zurückgibt). Einen Überblick über die gesamte Familie finden Sie unter PHP Output Control.