W3docs

Función PHP ob_get_level(): Todo lo que necesitas saber

Aprende cómo usar ob_get_level() en PHP para obtener el nivel actual de almacenamiento en búfer de salida y gestionar buffers anidados con seguridad.

ob_get_level() devuelve cuántos buffers de salida están activos en ese momento, es decir, qué tan profundamente está anidado el almacenamiento en búfer de salida. Los buffers de salida en PHP forman una pila: cada llamada a ob_start() agrega un nuevo buffer a la pila, y cada llamada a ob_end_* elimina uno. ob_get_level() te indica cuán alta está esa pila en ese momento.

Esta es la forma más segura de preguntar "¿está activo el almacenamiento en búfer de salida?" y "¿cuántas capas hay?" sin tocar el contenido almacenado. Esta página cubre la firma de la función, el valor de retorno, cómo funciona el anidamiento y las razones habituales por las que la usarías.

Sintaxis

ob_get_level(): int

La función no toma argumentos y devuelve un int:

  • 0 — no hay almacenamiento en búfer de salida activo.
  • 1 — exactamente un buffer está abierto.
  • 2, 3, … — esa cantidad de buffers están anidados uno encima del otro.

Nunca lanza excepciones ni produce salida propia, por lo que es seguro llamarla en cualquier lugar.

Un ejemplo básico

Cuando no se ha iniciado ningún buffer, el nivel es 0. Después de un ob_start() pasa a ser 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

Ten en cuenta que las dos llamadas a echo dentro del buffer son capturadas por el propio buffer; ob_end_clean() descarta ese texto capturado, por lo que lo único que llega al navegador es el 0 final. Para ver los valores intermedios durante el desarrollo, almacénalos en variables primero o usa ob_get_clean() para liberar el buffer.

Contar buffers anidados

Dado que los buffers se apilan, llamar a ob_start() dos veces da un nivel de 2. Este es el comportamiento que hace que ob_get_level() sea genuinamente útil:

<?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

Los frameworks, los motores de plantillas y los manejadores de cierre frecuentemente abren sus propios buffers, por lo que en una solicitud real el nivel puede ser ya 1 o más antes de que se ejecute tu propio código.

¿Cuándo lo usaría?

  • Limpieza defensiva. Antes de enviar cabeceras o iniciar un buffer nuevo, vacía lo que esté abierto para que la salida errante no rompa tu respuesta:

    <?php
    // Discard any buffers a framework or earlier code left open
    while (ob_get_level() > 0) {
        ob_end_clean();
    }
  • Volcado condicional. Solo vuelca si realmente hay un buffer activo, evitando una advertencia de ob_end_flush() cuando no existe ninguno:

    <?php
    if (ob_get_level() > 0) {
        ob_end_flush();
    }
  • Depuración de fugas de buffer. Registrar ob_get_level() al inicio y al final de una solicitud te ayuda a detectar un buffer que fue abierto pero nunca cerrado.

Consideraciones importantes

  • ob_get_level() no lee ni limpia el buffer; para eso usa ob_get_contents() o ob_get_clean().
  • Llamar a ob_end_clean() / ob_end_flush() cuando el nivel es 0 genera un aviso. Protege esas llamadas con una comprobación ob_get_level() > 0, como se muestra arriba.
  • Una configuración elevada de zlib.output_compression o de un framework puede hacer que el nivel sea distinto de cero desde la primera línea de tu script; nunca asumas que comienza en 0.

Conclusión

ob_get_level() informa la profundidad actual de la pila de buffers de salida de PHP: 0 cuando el almacenamiento en búfer está desactivado, y un número mayor por cada ob_start() anidado. Como inspecciona la pila sin consumir el contenido almacenado, es la herramienta adecuada para proteger las operaciones de buffer y para vaciar limpiamente todos los buffers abiertos antes de enviar la respuesta final.

Práctica

Práctica
¿Qué hace la función PHP ob_get_level()?
¿Qué hace la función PHP ob_get_level()?
Was this page helpful?