Función ob_get_length() de PHP: Todo lo que necesitas saber
Aprende a usar ob_get_length() en PHP para obtener el tamaño en bytes del búfer de salida activo y gestionar la salida antes de enviarla al navegador.
ob_get_length() devuelve el número de bytes que se encuentran actualmente en el búfer de salida activo de PHP — el contenido que ha sido capturado por ob_start() pero que aún no se ha enviado al navegador. Es muy útil cuando quieres medir la salida generada antes de decidir qué hacer con ella: imponer un límite de tamaño, construir una cabecera Content-Length, registrar el tamaño de un payload, o simplemente comprobar si se ha escrito algo.
Esta página cubre la firma de la función, su valor de retorno, las particularidades con búferes anidados y algunos patrones prácticos.
Sintaxis
ob_get_length(): int|falseLa función no acepta ningún argumento. Retorna:
- un entero — la longitud en bytes de los datos en el búfer de salida activo, o
false— si el búfer de salida no está activo (no se ha iniciado ningún búfer, o todos ya han sido cerrados).
Dado que puede retornar false, compara siempre con === en lugar de una comparación laxa si necesitas distinguir "sin búfer" de un búfer de longitud 0.
Un ejemplo básico
<?php
ob_start();
echo "This will be buffered"; // 21 bytes
$length = ob_get_length();
ob_end_clean(); // discard the buffer
echo "Buffered length was: $length"; // Buffered length was: 21Aquí ob_start() inicia el almacenamiento en búfer, por lo que echo escribe en el búfer en lugar de enviarlo al navegador. ob_get_length() reporta 21 (la longitud en bytes de la cadena). ob_end_clean() descarta el contenido del búfer — solo el echo final llega a la salida.
Ten en cuenta que la longitud se mide en bytes, no en caracteres. Una cadena UTF-8 multibyte reportará más bytes de los que tiene caracteres visibles.
Detectar si un búfer está activo
Cuando no hay ningún búfer en efecto, la función retorna false:
<?php
var_dump(ob_get_length()); // bool(false)
ob_start();
echo "hi";
var_dump(ob_get_length()); // int(2)
ob_end_clean();Esto hace que ob_get_length() sea una forma rápida de comprobar "¿se está almacenando algo en el búfer?" — estrechamente relacionada con ob_get_level(), que indica cuántos búferes anidados están abiertos.
Búferes anidados: solo se mide el activo
Los búferes de PHP pueden apilarse. ob_get_length() siempre reporta la longitud del búfer más alto (el más interno, el activo actualmente) — nunca el total combinado:
<?php
ob_start();
echo "outer"; // 5 bytes in the outer buffer
ob_start();
echo "inner text"; // 10 bytes in the inner buffer
$inner = ob_get_length(); // measures the active (inner) buffer
ob_end_clean(); // discard inner
$outer = ob_get_length(); // outer is active again
ob_end_clean(); // discard outer
echo "inner=$inner outer=$outer"; // inner=10 outer=5Si necesitas una visión completa, inspecciona cada nivel con ob_get_level() y ve eliminando los búferes uno a uno.
Un patrón práctico: omitir salida vacía
Un uso habitual es evitar emitir cualquier cosa (y el coste de trabajo relacionado) cuando un fragmento almacenado en búfer resultó estar vacío:
<?php
ob_start();
// ... template / partial that may or may not produce output ...
if (ob_get_length() > 0) {
// there is real content — send it
ob_end_flush();
} else {
// nothing was generated — drop the empty buffer
ob_end_clean();
}Para leer los bytes almacenados en el búfer en lugar de solo su longitud, usa ob_get_contents(); para obtener el contenido y cerrar el búfer en una sola llamada, utiliza ob_get_clean().
Conclusión
ob_get_length() reporta la longitud en bytes del búfer de salida activo de PHP, o false cuando no hay ningún búfer abierto. Recuerda tres cosas: cuenta bytes, mide solo el búfer activo en una pila anidada, y un retorno de false significa que el almacenamiento en búfer está desactivado. Combinada con el resto de las funciones de control de salida — ob_get_contents(), ob_get_clean() y ob_get_level() — te permite medir y gestionar la salida generada con precisión antes de que llegue al navegador.