W3docs

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

Aprende a usar ob_start() en PHP para almacenar en búfer la salida, capturarla como cadena, transformarla con callbacks y enviar cabeceras después de imprimir.

Cuando PHP ejecuta un script, cada echo, print o bloque de HTML se envía normalmente al cliente de inmediato. El almacenamiento en búfer de salida cambia eso: retiene todo lo que el script imprimiría en un búfer en memoria para que puedas capturarlo, modificarlo o descartarlo antes de que abandone el servidor. La función ob_start() es la función integrada que activa este almacenamiento en búfer.

Este capítulo explica qué hace ob_start(), sus parámetros, cómo capturar y transformar la salida, los casos de uso más comunes en el mundo real y los errores que suelen confundir a los desarrolladores.

¿Qué es la función ob_start()?

ob_start() activa el almacenamiento en búfer de salida. Mientras el almacenamiento en búfer está activo, nada de lo que el script imprime se envía al navegador. En su lugar, se acumula en un búfer interno hasta que lo envías explícitamente (flush), lo capturas como cadena o lo limpias.

Lo único que el almacenamiento en búfer no retiene son las cabeceras HTTP. Como el cuerpo ya no se envía de inmediato, puedes seguir llamando a funciones como header() después de haber hecho un echo — que es la razón más frecuente por la que los desarrolladores usan ob_start().

Los búferes también se anidan: cada llamada a ob_start() apila un nuevo búfer, y la función de cierre/flush correspondiente saca el de arriba. Puedes comprobar la profundidad de la pila con ob_get_level().

Sintaxis

ob_start(
    ?callable $callback = null,
    int $chunk_size = 0,
    int $flags = PHP_OUTPUT_HANDLER_STDFLAGS
): bool

Parámetros:

  • $callback — Opcional. Una función que recibe el contenido del búfer (y una máscara de bits de estado) y devuelve la cadena que se enviará realmente. Úsala para transformar todo lo que imprime el script — por ejemplo, minificar HTML o comprimirlo con gzip.
  • $chunk_size — Opcional. Si es mayor que 0, el callback se invoca cada vez que el búfer alcanza esta cantidad de bytes, en lugar de solo cuando se vacía. 0 (el valor predeterminado) significa vaciar solo al finalizar.
  • $flags — Opcional. Una máscara de bits que controla si el búfer puede limpiarse, vaciarse y eliminarse. El valor predeterminado PHP_OUTPUT_HANDLER_STDFLAGS permite las tres operaciones.

Valor de retorno: true en caso de éxito, false en caso de error.

Uso básico: capturar la salida

El patrón más común es iniciar un búfer, imprimir algo y luego capturarlo en una variable con ob_get_clean() (que devuelve el búfer y desactiva el almacenamiento en búfer en un solo paso):

<?php

ob_start();                 // start buffering — nothing is sent yet
echo "Hello, ";
echo "world!";
$output = ob_get_clean();   // grab the buffer as a string, stop buffering

echo strtoupper($output);   // now we control what actually gets sent

Salida:

HELLO, WORLD!

Aquí, las dos llamadas a echo nunca llegan al cliente directamente. ob_get_clean() devuelve "Hello, world!", y solo la versión en mayúsculas se imprime finalmente. Este flujo de "capturar y luego transformar" es lo que hace tan poderoso el almacenamiento en búfer.

Transformar la salida con un callback

En lugar de capturar manualmente, puedes pasar un callback a ob_start(). PHP lo ejecuta sobre el búfer automáticamente cuando este se vacía (aquí, al final del script):

<?php

function addBang(string $buffer): string
{
    return str_replace("world", "World!", $buffer);
}

ob_start("addBang");
echo "hello world";
// buffer is flushed automatically at script end → callback runs

Salida:

hello World!

Así es exactamente como funcionan los manejadores integrados como ob_gzhandler() — pásalo como callback y toda tu página se comprime con gzip de forma transparente.

Casos de uso comunes

  • Enviar cabeceras después de la salida. Como el cuerpo está almacenado en búfer, aún puedes llamar a header() o setcookie() después de imprimir HTML, evitando la temida advertencia "headers already sent". Ver headers_sent().
  • Plantillas. Captura el HTML renderizado de un archivo de plantilla en una cadena en lugar de imprimirlo directamente, para que pueda devolverse, almacenarse en caché o envolverse en un diseño.
  • Posprocesamiento de la página completa. Minifica HTML, reescribe URLs o elimina comentarios mediante un callback antes de que se envíe cualquier cosa.
  • Compresión. Usa ob_gzhandler para comprimir las respuestas sin cambiar las llamadas echo de tu script.

Funciones relacionadas

Raramente usarás ob_start() sola. Estas funciones gestionan el búfer que crea:

  • ob_get_contents() — Devuelve el contenido del búfer sin limpiarlo.
  • ob_get_clean() — Devuelve el búfer y desactiva el almacenamiento en búfer.
  • ob_clean() — Descarta el contenido del búfer pero mantiene el almacenamiento en búfer activo.
  • ob_end_flush() — Envía el búfer al cliente y desactiva el almacenamiento en búfer.
  • ob_end_clean() — Descarta el búfer y desactiva el almacenamiento en búfer (no envía nada).
  • ob_get_level() — Devuelve cuántos búferes anidados están activos en este momento.

Para una visión más amplia, consulta PHP Output Control.

Errores comunes

  • Cierra siempre lo que abres. Cada ob_start() debe tener una llamada de flush/clean correspondiente. Un búfer sin cerrar se vacía automáticamente al final del script, pero dejarlos abiertos en scripts largos puede ocultar la salida o desperdiciar memoria.
  • ob_get_clean() devuelve false si no hay búfer activo. Llamarla sin un ob_start() correspondiente da false, no una cadena vacía.
  • Almacenamiento en búfer ≠ cabeceras infinitas. Las cabeceras no se almacenan en búfer por sí mismas; solo el cuerpo lo es. Una vez que cualquier búfer se vacía hacia el cliente, las cabeceras quedan bloqueadas.

Conclusión

ob_start() activa el almacenamiento en búfer de salida para que PHP retenga la salida del script en memoria en lugar de enviarla de inmediato. Eso te permite capturar la salida en una cadena, transformarla con un callback, enviar cabeceras después de imprimir o comprimir una página completa. Combínala con ob_get_clean() para capturar, ob_end_flush() para enviar y ob_end_clean() para descartar — y recuerda siempre cerrar cada búfer que abras.

Práctica

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