PHP ob_get_level() Funktion: Alles, was Sie wissen müssen
Die PHP-Funktion ob_get_level() gibt die aktuelle Tiefe des Ausgabepuffer-Stacks zurück. Erfahren Sie Syntax, Rückgabewerte und typische Anwendungsfälle.
ob_get_level() gibt zurück, wie viele Ausgabepuffer derzeit aktiv sind — also wie tief das Ausgabe-Buffering verschachtelt ist. Ausgabepuffer in PHP bilden einen Stack: Jeder Aufruf von ob_start() legt einen neuen Puffer auf den Stack, und jeder ob_end_*-Aufruf entfernt einen. ob_get_level() zeigt an, wie hoch dieser Stack gerade ist.
Dies ist der sicherste Weg, um zu fragen: „Ist das Ausgabe-Buffering aktiv?" und „Wie viele Ebenen gibt es?" — ohne den gepufferten Inhalt anzutasten. Diese Seite behandelt die Signatur der Funktion, den Rückgabewert, wie die Verschachtelung funktioniert und die häufigsten Gründe, warum man sie verwenden würde.
Syntax
ob_get_level(): intDie Funktion nimmt keine Argumente und gibt einen int zurück:
0— kein Ausgabe-Buffering ist aktiv.1— genau ein Puffer ist geöffnet.2,3, … — so viele Puffer sind übereinander verschachtelt.
Sie wirft niemals eine Ausnahme und erzeugt keine eigene Ausgabe, daher ist sie überall sicher aufzurufen.
Ein einfaches Beispiel
Wenn kein Puffer gestartet wurde, ist der Level 0. Nach einem ob_start() wird er 1:
<?php
echo ob_get_level(); // 0 — nothing buffered yet
ob_start();
echo ob_get_level(); // 1 — one buffer is now active
ob_end_clean();
echo ob_get_level(); // 0 — buffer popped, back to baselineBeachten Sie, dass die beiden echo-Aufrufe innerhalb des Puffers selbst vom Puffer erfasst werden; ob_end_clean() verwirft diesen erfassten Text, sodass das Einzige, was den Browser erreicht, die abschließende 0 ist. Um die Zwischenwerte während der Entwicklung zu sehen, speichern Sie sie zunächst in Variablen oder verwenden Sie ob_get_clean(), um den Puffer freizugeben.
Verschachtelte Puffer zählen
Da Puffer gestapelt werden, ergibt das zweimalige Aufrufen von ob_start() einen Level von 2. Das ist das Verhalten, das ob_get_level() wirklich nützlich macht:
<?php
ob_start(); // level 1
ob_start(); // level 2
$level = ob_get_level(); // 2
ob_end_clean(); // level 1
ob_end_clean(); // level 0
echo "Deepest nesting was: {$level}"; // Deepest nesting was: 2Frameworks, Template-Engines und Shutdown-Handler öffnen häufig eigene Puffer, sodass der Level bei einer echten Anfrage möglicherweise bereits 1 oder höher ist, bevor Ihr eigener Code ausgeführt wird.
Wann würde ich es verwenden?
-
Defensives Aufräumen. Bevor Sie Header senden oder einen neuen Puffer starten, leeren Sie alles, was geöffnet ist, damit unerwartete Ausgaben Ihre Antwort nicht beschädigen:
<?php // Discard any buffers a framework or earlier code left open while (ob_get_level() > 0) { ob_end_clean(); } -
Bedingtes Flushen. Nur flushen, wenn tatsächlich ein Puffer aktiv ist, um eine
ob_end_flush()-Warnung zu vermeiden, wenn keiner vorhanden ist:<?php if (ob_get_level() > 0) { ob_end_flush(); } -
Debugging von Puffer-Lecks. Das Protokollieren von
ob_get_level()am Anfang und Ende einer Anfrage hilft dabei, einen Puffer zu erkennen, der geöffnet, aber nie geschlossen wurde.
Fallstricke
ob_get_level()liest oder löscht den Puffer nicht — dafür verwenden Sieob_get_contents()oderob_get_clean().- Das Aufrufen von
ob_end_clean()/ob_end_flush()bei einem Level von0erzeugt einen Notice. Schützen Sie solche Aufrufe mit einerob_get_level() > 0-Prüfung, wie oben gezeigt. - Eine hohe
zlib.output_compression- oder Framework-Konfiguration kann dazu führen, dass der Level von der allerersten Zeile Ihres Skripts an ungleich null ist — gehen Sie niemals davon aus, dass er bei0beginnt.
Fazit
ob_get_level() gibt die aktuelle Tiefe von PHPs Ausgabepuffer-Stack zurück: 0 wenn Buffering deaktiviert ist, und eine höhere Zahl für jeden verschachtelten ob_start()-Aufruf. Da die Funktion den Stack inspiziert, ohne den gepufferten Inhalt zu verbrauchen, ist sie das richtige Werkzeug zum Absichern von Puffer-Operationen und zum sauberen Leeren aller geöffneten Puffer, bevor Sie Ihre endgültige Antwort senden.