Función ob_end_clean() de PHP: Todo lo que necesitas saber
Aprende a usar ob_end_clean() en PHP para descartar el buffer de salida y detener el almacenamiento en buffer. Sintaxis, valores de retorno y ejemplos.
Cuando PHP se ejecuta con almacenamiento en buffer de salida, todo lo que tu script imprime con echo se recopila en un buffer en memoria en lugar de enviarse directamente al navegador. A veces querrás descartar esa salida capturada y detener el almacenamiento en buffer por completo — por ejemplo, después de capturar algo solo para inspeccionarlo, o cuando un error significa que la respuesta a medio construir nunca debería llegar al usuario. Eso es exactamente lo que hace ob_end_clean(). Esta página cubre su sintaxis, valor de retorno, casos de uso comunes y cómo se diferencia de las funciones ob_* relacionadas.
¿Qué es la función ob_end_clean()?
ob_end_clean() hace dos cosas en una sola llamada al buffer de salida más alto (el iniciado más recientemente):
- Descarta su contenido actual — la salida almacenada en buffer se elimina, no se envía.
- Desactiva ese nivel de almacenamiento en buffer — el buffer se cierra y se elimina de la pila.
La función existe desde PHP 4. El nombre se descompone como output buffer (ob) — end — clean: "end" significa cerrar el nivel del buffer, "clean" significa descartar el contenido (a diferencia de "flush", que lo envía).
Sintaxis
ob_end_clean(): boolNo acepta argumentos y devuelve un booleano.
Valor de retorno y manejo de errores
| Situación | Resultado |
|---|---|
| Un buffer estaba activo y se cerró con éxito | devuelve true |
| No hay buffer de salida activo | devuelve false y emite un E_NOTICE |
| El buffer no puede eliminarse (p. ej., el manejador lo prohíbe) | devuelve false |
Dado que advierte cuando no hay ningún buffer activo, protege la llamada con ob_get_level() cuando no estás seguro de que haya uno abierto:
<?php
if (ob_get_level() > 0) {
ob_end_clean();
}
?>Ejemplo básico
<?php
ob_start(); // Start buffering
echo "This will be thrown away";
ob_end_clean(); // Discard the buffer, stop buffering
echo "Only this line reaches the browser";
?>Salida:
Only this line reaches the browserEl primer echo nunca aparece: ob_end_clean() eliminó el buffer que contenía "This will be thrown away".
¿Cuándo lo usaría?
- Suprimir salida no deseada de una función, librería o plantilla que no controlas, para que no pueda corromper la respuesta.
- Descartar una página a medio renderizar cuando ocurre un error o una redirección a mitad del proceso, para que el usuario reciba una respuesta limpia en lugar de una rota.
- Capturar y descartar salida durante pruebas o mediciones (por ejemplo, para medir cuánto tarda un renderizado sin imprimirlo realmente).
<?php
ob_start();
try {
render_complex_page(); // emits lots of output
throw new RuntimeException('boom');
} catch (Throwable $e) {
ob_end_clean(); // drop the partial page
http_response_code(500);
echo "Sorry, something went wrong.";
}
?>ob_end_clean() vs. funciones relacionadas
La familia ob_* se divide en dos ejes — clean vs. flush (descartar vs. enviar) y end vs. get (cerrar el buffer vs. mantenerlo abierto / devolver una cadena):
| Función | ¿Envía el buffer? | ¿Cierra el buffer? | ¿Devuelve el contenido? |
|---|---|---|---|
ob_end_clean() | No | Sí | No |
ob_end_flush() | Sí | Sí | No |
ob_get_clean() | No | Sí | Sí (como string) |
ob_clean() | No | No (sigue almacenando en buffer) | No |
Si necesitas el texto descartado como string, usa ob_get_clean() en lugar de ob_end_clean(). Para enviar el buffer en vez de descartarlo, usa ob_end_flush(). Todas estas funciones requieren un buffer previamente abierto con ob_start().
Buffers anidados
Los buffers de salida forman una pila. ob_end_clean() solo afecta al buffer más interno; los buffers exteriores permanecen intactos. Cada nivel necesita su propia llamada para cerrarse:
<?php
ob_start(); // level 1
echo "outer ";
ob_start(); // level 2
echo "inner";
ob_end_clean(); // drops "inner", level 1 still open
echo " world";
ob_end_flush(); // sends "outer world"
?>Salida:
outer worldConclusión
ob_end_clean() descarta el contenido del buffer de salida activo y cierra ese nivel de almacenamiento en buffer, devolviendo true en caso de éxito. Úsala para descartar salida que nunca quieras enviar — y recurre a ob_get_clean(), ob_end_flush() o ob_clean() cuando en su lugar necesites el contenido, quieras enviarlo o quieras seguir almacenando en buffer. Consulta la descripción general del control de salida de PHP para obtener el panorama completo.