PHP ob_list_handlers() Funktion: Alles, was Sie wissen müssen
Die PHP-Funktion ob_list_handlers() gibt ein Array mit den Namen aller aktiven Output-Handler zurück. Syntax, Rückgabewerte und Praxisbeispiele.
Die Funktion ob_list_handlers() gibt ein Array zurück, das die Namen aller aktuell aktiven Output-Buffer-Handler enthält, geordnet vom äußersten zum innersten Buffer. Output-Buffering ermöglicht es PHP, die generierte Ausgabe im Speicher zu sammeln, anstatt sie direkt an den Browser zu senden. Ein Handler ist der optionale Callback, den Sie mit ob_start() an einen Buffer anhängen, um die Ausgabe vor dem Leeren zu transformieren. Diese Seite behandelt die Syntax, den Rückgabewert, die Benennung der Handler durch PHP und wann der Einsatz von ob_list_handlers() wirklich sinnvoll ist.
Syntax
ob_list_handlers(): arrayDie Funktion nimmt keine Argumente entgegen und gibt ein Array von Strings zurück. Wenn kein Output-Buffer aktiv ist, gibt sie ein leeres Array zurück.
Wie die Handler-Namen aussehen
Die zurückgegebenen Strings sind nicht der Inhalt des Buffers — sie sind Bezeichnungen, die jeden Handler identifizieren. Die Bezeichnung hängt davon ab, wie der Buffer geöffnet wurde:
| Wie der Buffer gestartet wurde | Name im Array |
|---|---|
ob_start() ohne Callback | "default output handler" |
ob_start('ob_gzhandler') (eingebaut) | "ob_gzhandler" |
ob_start('my_function') (benannter Callback) | "my_function" |
ob_start(fn($b) => $b) (Closure) | "Closure::__invoke" |
Da anonyme Funktionen alle als "Closure::__invoke" gemeldet werden, können Sie zwei verschiedene Closures anhand dieses Arrays nicht unterscheiden — benennen Sie Ihre Handler-Funktionen, wenn Sie sie später identifizieren müssen.
Grundlegende Verwendung
Rufen Sie ob_list_handlers() auf und iterieren Sie über das Ergebnis. Wenn nichts gepuffert ist, ist das Array leer — berücksichtigen Sie diesen Fall:
<?php
$handlers = ob_list_handlers();
if (empty($handlers)) {
echo "No output handlers are active.\n";
} else {
foreach ($handlers as $handler) {
echo $handler . "\n";
}
}Ohne gestarteten Buffer gibt dies aus:
No output handlers are active.Verschachtelte Handler untersuchen
Output-Buffer stapeln sich: jedes ob_start() öffnet einen neuen Buffer über dem vorherigen. ob_list_handlers() spiegelt diesen gesamten Stack wider und ist daher praktisch, um genau zu sehen, was übereinandergeschichtet ist.
<?php
function uppercase_handler(string $buffer): string
{
return strtoupper($buffer);
}
ob_start(); // default buffer, no callback
ob_start('uppercase_handler'); // named callback
ob_start(function ($buffer) { // anonymous callback
return trim($buffer);
});
print_r(ob_list_handlers());Ausgabe:
Array
(
[0] => default output handler
[1] => uppercase_handler
[2] => Closure::__invoke
)Die Reihenfolge entspricht der Reihenfolge, in der die Buffer geöffnet wurden: Index 0 ist der äußerste (erste) Buffer, und der letzte Index ist der innerste (zuletzt gestartete).
Wann würde ich das verwenden?
ob_list_handlers() ist ein Diagnosewerkzeug, das Sie nicht bei der normalen Anfrageverarbeitung einsetzen. Greifen Sie darauf zurück, wenn Sie:
- „Headers already sent"- oder unerwartete Ausgabefehler debuggen möchten, indem Sie bestätigen, welche Buffering-Schichten aktiv sind.
- Doppelte Komprimierung vermeiden wollen — prüfen Sie auf
"ob_gzhandler", bevor Sie Ihren eigenen gzip-Handler hinzufügen, da die INI-Einstellungzlib.output_compressionmöglicherweise bereits einen registriert. - Framework- oder Middleware-Verhalten überprüfen möchten, da viele Frameworks ihre eigenen Buffer öffnen und Sie möglicherweise nicht wissen, wie tief der Stack ist.
Um aktive Buffer zu zählen, anstatt sie zu benennen, gibt ob_get_level() die Tiefe direkt zurück:
<?php
ob_start();
ob_start('ob_gzhandler');
echo count(ob_list_handlers()), "\n"; // 2
echo ob_get_level(), "\n"; // 2Ausgabe:
2
2Häufige Fallstricke
- Leeres Array ist normal. Eine Rückgabe von
[]bedeutet einfach, dass kein Buffer geöffnet ist — das ist kein Fehler. - Ein Name pro Buffer. Ein Buffer, der ohne Callback gestartet wurde, erscheint trotzdem als
"default output handler"; der Name spiegelt den Handler wider, nicht ob ein Buffer existiert. - Namen sind nicht aufrufbar. Die Strings sind nur Bezeichnungen. Sie können
"Closure::__invoke"nicht anob_start()übergeben, um denselben Handler neu zu erstellen.
Verwandte Funktionen
ob_start()— einen neuen Output-Buffer öffnen und optional einen Handler anhängen.ob_get_level()— die Verschachtelungstiefe des Output-Bufferings ermitteln.ob_get_contents()— den Inhalt des aktuellen Buffers lesen.ob_end_flush()/ob_end_clean()— den obersten Buffer schließen.- PHP Output Control — Übersicht der Output-Buffering-Familie.
Fazit
ob_list_handlers() liefert Ihnen eine schnelle, schreibgeschützte Momentaufnahme des Output-Buffer-Stacks und benennt jeden aktiven Handler vom äußersten zum innersten. Am wertvollsten ist sie beim Debuggen von Buffering-Problemen oder vor der Registrierung eines Handlers (z. B. gzip), der möglicherweise bereits vorhanden ist. Kombinieren Sie sie mit ob_get_level(), wenn Sie nur die Anzahl benötigen.