W3docs

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(): int

Die 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 baseline

Beachten 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: 2

Frameworks, 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 Sie ob_get_contents() oder ob_get_clean().
  • Das Aufrufen von ob_end_clean() / ob_end_flush() bei einem Level von 0 erzeugt einen Notice. Schützen Sie solche Aufrufe mit einer ob_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 bei 0 beginnt.

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.

Übungen

Übung
Was macht die PHP-Funktion ob_get_level()?
Was macht die PHP-Funktion ob_get_level()?
Was this page helpful?