W3docs

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

Aprende a usar ob_end_flush() en PHP para enviar el contenido del búfer de salida al navegador y cerrar el búfer de forma correcta.

Cuando PHP captura la salida en un búfer en lugar de enviarla directamente al navegador, eventualmente necesitas liberar ese búfer. La función ob_end_flush() hace exactamente eso: envía el contenido del búfer de salida más interno al siguiente nivel (el navegador, o un búfer externo) y luego elimina ese búfer. Esta página explica qué hace la función, cuándo utilizarla, en qué se diferencia de sus funciones relacionadas y los errores comunes que suelen cometerse.

Qué hace la función ob_end_flush()

ob_end_flush() realiza dos pasos sobre el búfer de salida activo más interno (superior):

  1. Vacía el búfer: su contenido se pasa al búfer padre, o se envía al cliente si este era el último búfer en la pila.
  2. Desactiva ese búfer, eliminándolo de la pila de búferes.

Devuelve true en caso de éxito, o false si no existe ningún búfer activo (por ejemplo, si la llamas dos veces o si nunca llamaste a ob_start()). Cuando falla, también emite un E_NOTICE.

Los búferes forman una pila. Cada ob_start() añade un nuevo búfer encima. ob_end_flush() solo actúa sobre el que está en la cima, no sobre todos los búferes a la vez. Comprueba cuántos están abiertos con ob_get_level().

Sintaxis

ob_end_flush(): bool

La función no recibe argumentos y devuelve un booleano.

Ejemplo básico

<?php

ob_start();                       // start capturing output
echo "This will be buffered";     // goes into the buffer, not the screen yet
$ok = ob_end_flush();             // send the buffer out, then close it

var_dump($ok);                    // bool(true)

Salida:

This will be bufferedbool(true)

ob_start() abre el búfer, el echo se almacena en él, y ob_end_flush() envía el texto al navegador y finaliza el almacenamiento en búfer. El var_dump() se ejecuta después de que el búfer desaparece, por lo que su salida se envía directamente.

¿Cuándo usarla?

El almacenamiento en búfer de salida es más útil cuando necesitas decidir tarde qué hacer con la salida que ya has generado:

  • Capturar y luego inspeccionar o modificar — almacena una sección en búfer, léela con ob_get_contents(), modifícala opcionalmente y luego usa ob_end_flush() para enviar el resultado (posiblemente modificado).
  • Enviar cabeceras después de la salida — dado que nada llega al cliente mientras el almacenamiento en búfer está activo, todavía puedes llamar a header() o setcookie() incluso después de haber usado echo con marcado HTML. ob_end_flush() libera todo una vez que las cabeceras están establecidas.
  • Plantillas anidadas — envuelve un búfer interno, vacíalo en un búfer externo que realice un procesamiento adicional.

Si en cambio quieres conservar el texto capturado en una variable en lugar de enviarlo, usa ob_get_clean(). Si quieres descartar la salida, usa ob_end_clean().

ob_end_flush() vs funciones relacionadas

Función¿Envía el búfer?¿Mantiene el búfer abierto?¿Devuelve el contenido?
ob_end_flush()No (lo cierra)No (devuelve bool)
ob_get_flush()No (lo cierra)Sí (devuelve la cadena)
ob_flush()Sí (permanece abierto)No
ob_end_clean()No (descarta)No (lo cierra)No

Una forma rápida de recordarlo: flush envía, clean descarta, get_ también te devuelve la cadena, y end_ cierra el búfer en lugar de dejarlo abierto.

Vaciado de búferes anidados

Dado que ob_end_flush() solo cierra un nivel, debes llamarla una vez por búfer para deshacer completamente la pila:

<?php

ob_start();                 // level 1
echo "outer ";

ob_start();                 // level 2
echo "inner";

echo ob_get_level();        // 2 — captured into level 2

ob_end_flush();             // level 2 flushes into level 1
ob_end_flush();             // level 1 flushes to the browser

Salida:

outer inner2

El echo interno y el contador de niveles quedan en el búfer 2; el primer ob_end_flush() los fusiona en el búfer 1, y el segundo envía todo al cliente.

Errores comunes

  • Llamarla sin ningún búfer activo devuelve false y genera un aviso. Usa if (ob_get_level() > 0) como guarda si no estás seguro de que haya un búfer abierto.
  • No vacía todo — una llamada cierra un solo búfer. Itera en bucle hasta que ob_get_level() sea 0 para deshacer todos los niveles.
  • No la confundas con flush(). La función flush() sin más empuja los búferes de escritura de PHP/SAPI al cliente, pero no toca la pila de almacenamiento en búfer de salida.

Conclusión

ob_end_flush() envía el búfer de salida actual al siguiente nivel y luego cierra ese búfer. Úsala cuando hayas utilizado ob_start() para capturar la salida y ahora quieras liberarla. Recuerda que los búferes forman una pila, que la función actúa solo sobre el más superior, y que sus variantes clean/get_ ofrecen las opciones de descartar y devolver que podrías necesitar en su lugar.

Práctica

Práctica
¿Cuál es el propósito de la función ob_end_flush() en PHP?
¿Cuál es el propósito de la función ob_end_flush() en PHP?
Was this page helpful?