Función PHP ob_get_contents(): Todo lo que necesitas saber
Aprende a usar ob_get_contents() en PHP para leer el contenido del búfer de salida sin vaciarlo ni detener el almacenamiento en búfer.
Normalmente, cuando tu script usa echo o print, PHP envía el resultado directamente al navegador. El almacenamiento en búfer de salida te permite interceptar esa salida y mantenerla en memoria, para que puedas capturarla, modificarla o descartarla antes de que llegue al cliente. La función ob_get_contents() es la herramienta que te permite leer lo que hay actualmente en ese búfer.
Este capítulo explica qué devuelve ob_get_contents(), cuándo usarla, los errores comunes a evitar y cómo encaja junto a las demás funciones de control de salida.
Qué hace ob_get_contents()
ob_get_contents() devuelve el contenido del búfer de salida activo sin vaciarlo ni detener el almacenamiento en búfer. El búfer sigue acumulando salida, por lo que puedes llamar a la función varias veces para ver lo que se ha acumulado hasta el momento.
Solo funciona mientras haya un búfer iniciado por ob_start() activo. Si no hay ningún búfer activo, devuelve false.
Sintaxis
ob_get_contents(): string|false- Parámetros: ninguno.
- Valor de retorno: el contenido actual del búfer como string, o
falsesi el almacenamiento en búfer de salida no está activo.
Un ejemplo básico
<?php
ob_start(); // 1. Start capturing output
echo "This will be buffered"; // 2. Goes into the buffer, not the screen
$output = ob_get_contents(); // 3. Read the buffer into a variable
ob_end_clean(); // 4. Discard the buffer and stop buffering
echo "Captured: " . $output;Esto imprime:
Captured: This will be bufferedAquí ob_start() inicia el almacenamiento en búfer, por lo que el echo se mantiene en memoria en lugar de enviarse al navegador. ob_get_contents() copia ese texto en $output. Finalmente, ob_end_clean() descarta el búfer y desactiva el almacenamiento en búfer — sin él, el texto almacenado en el búfer todavía se enviaría a la página.
ob_get_contents() no vacía el búfer
Un punto de confusión habitual: leer el búfer no lo modifica. La salida sigue ahí y se enviará al navegador cuando termine el almacenamiento en búfer (a menos que la limpies).
<?php
ob_start();
echo "Hello";
$first = ob_get_contents(); // "Hello"
echo " World";
$second = ob_get_contents(); // "Hello World" — the buffer kept growing
ob_end_flush(); // sends "Hello World" to the browser
var_dump($first, $second);Esto muestra:
Hello World
string(5) "Hello"
string(11) "Hello World"Si en cambio quieres leer y borrar el búfer en un solo paso, usa ob_get_clean().
¿Cuándo usaría esto?
- Capturar salida renderizada. Renderiza una plantilla o incluye un archivo, y luego obtén el resultado como string en lugar de imprimirlo — útil para correos electrónicos, caché o generación de archivos.
- Post-procesamiento de HTML. Almacena una página en el búfer, léela con
ob_get_contents(), aplica una transformación (minificar, reemplazar marcadores de posición) y luego muestra el resultado. - Suprimir o inspeccionar la salida de una función o librería que imprime directamente.
<?php
function renderGreeting(string $name): void
{
echo "<p>Hello, {$name}!</p>";
}
ob_start();
renderGreeting("Ada");
$html = ob_get_contents(); // capture instead of printing
ob_end_clean();
$html = str_replace("Hello", "Welcome", $html);
echo $html;Esto muestra:
<p>Welcome, Ada!</p>Errores comunes
- Devuelve
false, no un string vacío, cuando no hay ningún búfer activo. Usa una comprobación estricta (=== false) si necesitas distinguir "sin búfer" de "búfer vacío". - Búferes anidados:
ob_get_contents()lee solo el nivel de búfer más interno (actual). Para ver cuántos búferes están apilados, usaob_get_level(). - No detiene el almacenamiento en búfer. Combínala con
ob_end_clean()oob_end_flush()cuando hayas terminado.
Funciones relacionadas
ob_start()— activar el almacenamiento en búfer de salida.ob_get_clean()— obtener el contenido del búfer y descartarlo.ob_get_length()— obtener la longitud del búfer en bytes.- Descripción general del control de salida de PHP — la familia completa de funciones
ob_*.
Conclusión
ob_get_contents() lee el búfer de salida actual como string sin vaciarlo ni finalizar el almacenamiento en búfer. Es el bloque fundamental para capturar salida renderizada, post-procesar HTML y suprimir salida directa. Recuerda que devuelve false cuando no hay ningún búfer activo, y que deja el búfer intacto — recurre a ob_get_clean() cuando quieras leer y limpiar en un solo movimiento.