ob_flush limpiar failed example contents clean php flush output-buffering

limpiar - Búfer PHP ob_flush() vs. flush()



php flush contents (4)

¿Cuál es la diferencia entre ob_flush() y flush() y por qué debo llamar a ambos?

La referencia ob_flush() dice:

Esta función enviará el contenido del buffer de salida (si hay alguno).

La referencia flush() dice:

Vacía los búferes de escritura de PHP y cualquier backend que PHP esté usando (CGI, un servidor web, etc.).

Sin embargo, continúa diciendo:

[it] puede no ser capaz de anular el esquema de almacenamiento en búfer de su servidor web ...

Entonces, me parece que podría usar ob_flush() todo el tiempo. Sin embargo, obtengo resultados extraños cuando hago eso. ¿Podría alguien explicar en términos simples qué está pasando aquí?


Supongo que esto está relacionado con tu pregunta anterior . La gran ventaja de utilizar el buffer de salida es cuando se usa junto con la compresión de datos. Si no estás usando ob_gzhandler , hay poco que ganar. solo por flush solo confirmará los datos de salida que aún estén en el servidor. Con ob_start y sus contrapartes ob_flush , ob_end_clean y ob_end_flush , lo que está esperando ser comprimido (vea flush y ob_flush como referirse a diferentes cubos - ob envía datos para flush , flush envía datos al navegador - puede no ser exacto, pero esa es la idea) será envuelto y enviado al cliente.


ob_flush() es un color de alto nivel. Vacía los búferes de alto nivel y pone todo el contenido en los búferes internos de bajo nivel listos para enviar.

  • Tenga en cuenta que la familia de funciones ob_ crea pilas de búferes, por lo que escribir ciegamente ob_flush() todas partes sí le dará "resultados extraños" si el código se escribió para aprovechar este apilamiento.

flush() es un color de bajo nivel que ordena a PHP que purgue sus búferes de datos internos de bajo nivel.

Debajo de eso, aún, habrá buffers de la capa de socket; debajo de eso, hay búferes de capa de red. Y, en el nivel más bajo, la fila de electrones baja por el cable de datos.


ob_flush envía un búfer iniciado por la aplicación. Puede haber múltiples anidados ob_start() en cualquier script PHP. ob_flush pasa el contenido actual a la capa superior.

PHP mismo podría (a su propia discreción) salida de búfer. Esto depende del back-end. Pero generalmente FastCGI tiene un buffer de socket por sí mismo. Por lo tanto, también se debe invocar flush() para enviar el contenido actual al servidor web.

Y ahora el servidor web podría implementar otro esquema de almacenamiento en búfer ( mod_deflate o filtro de contenido), sobre el cual no tiene influencia. Pero esto es raro, ya que debe configurarse específicamente.

De todos modos, usa ambos.


ob_flush los almacenamientos intermedios de salida creados con una función como ob_start

flush descarga el resultado del script PHP en sí mismo a su llamador