W3docs

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

Aprende a usar ob_implicit_flush() en PHP para activar o desactivar el vaciado implícito del búfer de salida con ejemplos prácticos.

Por defecto, PHP recopila todo lo que tu script genera en un búfer interno y lo envía al cliente en fragmentos. El vaciado implícito cambia eso: le indica a PHP que envíe la salida al cliente después de cada sentencia de salida en lugar de esperar. La función ob_implicit_flush() es el interruptor integrado que activa o desactiva este comportamiento. Este artículo cubre su sintaxis, parámetros, valor de retorno, casos de uso reales y los errores comunes que suelen ocurrir.

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

La función ob_implicit_flush() activa o desactiva el vaciado implícito para el nivel actual del búfer de salida. Cuando está habilitado, PHP se comporta como si llamara a ob_flush() automáticamente después de cada echo, print, printf o print_r — de modo que la salida se entrega a la siguiente capa de inmediato en lugar de retenerse.

Esto es más útil para scripts de larga duración en los que quieres que el usuario vea el progreso a medida que ocurre — por ejemplo, un registro de despliegue, una exportación CSV o una barra de progreso — en lugar de mirar una página en blanco hasta que el script termine por completo.

Importante: el vaciado implícito solo afecta al búfer de salida propio de PHP. Los servidores web como Apache, Nginx y PHP-FPM mantienen sus propios búferes, y el navegador también. Para enviar bytes realmente hasta el usuario, normalmente necesitarás una llamada separada a flush() y, idealmente, que ningún búfer de ob_start() retenga los datos.

Sintaxis

ob_implicit_flush(bool $enable = true): void

Parámetros

ParámetroTipoDescripción
$enablebooltrue activa el vaciado implícito, false lo desactiva. El valor predeterminado es true.

Valor de retorno

En PHP 8.0 y versiones posteriores la función devuelve void. En PHP 7.x y versiones anteriores devolvía el estado anterior del vaciado implícito como un bool. Debido a este cambio, no dependas de su valor de retorno en código que deba ejecutarse en múltiples versiones.

Cómo usar la función ob_implicit_flush()

El patrón habitual es deshabilitar el búfer regular de PHP (o finalizarlo), habilitar el vaciado implícito y llamar a flush() para superar el búfer del servidor:

<?php

// Turn off PHP's output buffering for this script so nothing is held back.
while (ob_get_level() > 0) {
    ob_end_flush();
}

ob_implicit_flush(true);

for ($i = 1; $i <= 3; $i++) {
    echo "Step {$i} done\n";
    flush();   // defeat the web server buffer
    sleep(1);  // simulate slow work
}

echo "All steps finished\n";

Cada línea aparece en el navegador aproximadamente con un segundo de diferencia en lugar de todas a la vez al final. ob_implicit_flush(true) elimina la necesidad de llamar a ob_flush() después de cada echo, mientras que flush() empuja los datos más allá del búfer propio del servidor web.

En una ejecución por línea de comandos, las capas de búfer por encima de PHP no existen, por lo que la salida ya se transmite línea por línea — eso hace que la CLI sea un buen lugar para confirmar tu lógica antes de desplegar detrás de un servidor web.

¿Cuándo deberías usarla?

  • Transmisión de salida de progreso — trabajos de importación, procesamiento por lotes o cualquier situación en la que una línea de estado por elemento mantenga la conexión activa y al usuario informado.
  • Server-Sent Events (SSE) — enviar líneas data: al navegador en tiempo real.
  • Depuración de problemas de búfer — habilitarlo temporalmente te ayuda a ver exactamente dónde se detiene la salida.

Por lo general, no querrás el vaciado implícito para páginas normales: enviar la salida en un solo lote es más eficiente y permite a PHP establecer cabeceras más adelante en el script.

Errores comunes

  • Por sí sola no es suficiente. El búfer a nivel de servidor (y gzip/mod_deflate) todavía puede retener tu salida. Para entrega en tiempo real puede que necesites deshabilitar la compresión y llamar a flush().
  • Un búfer activo de ob_start() la anula. Si hay un búfer abierto, la salida va allí primero. Ciérralo con ob_end_flush() o ob_end_clean() antes de depender del vaciado implícito.
  • No puedes enviar cabeceras después del vaciado. Una vez que se vacía cualquier salida, las llamadas a header() fallarán con "headers already sent."

Funciones relacionadas

Conclusión

La función ob_implicit_flush() proporciona un interruptor sencillo para que PHP envíe la salida inmediatamente después de cada sentencia en lugar de almacenarla en búfer. Combinada con flush() y un conocimiento de los búferes del lado del servidor, te permite crear indicadores de progreso y respuestas de transmisión para scripts de larga duración. Para páginas ordinarias, déjala desactivada y deja que PHP agrupe la salida por ti.

Práctica

Práctica
¿Qué hace ob_implicit_flush(1) en PHP?
¿Qué hace ob_implicit_flush(1) en PHP?
Was this page helpful?