Cuál es la diferencia entre ob_flush()
yflush()
y por qué debo llamar a ambos?
La ob_flush()
referencia dice:
Esta función enviará el contenido del búfer de salida (si lo hubiera).
La flush()
referencia 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 que no pueda 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. ¿Alguien podría explicar en términos simples qué está pasando aquí?
output_buffering
opción de configuración, cuyo valor predeterminado en las versiones de producción de php.ini es 4096. Eso significa que cuando se inicia cualquier script PHP, los primeros 4096 bytes de salida se almacenan en búfer (en un búfer que se puede descargar conob_flush()
). Por eso es necesario utilizarob_flush()
tan bien comoflush()
. Deshabilitar aoutput_buffering
través de php.ini o llamarob_end_clean()
oob_end_flush()
al comienzo del script elimina esta necesidad.ob_end_clean()
al "inicio del guión" parece contradictorio. ¿Quiere decir que deberíamos incluir esto poco despuésob_start()
y antes de los dos lavados?ob_start()
y unob_end_clean()
al comienzo del guión. Luego, después de cualquier "eco" durante la secuencia de comandos, también incluyoob_flush(); flush();
, y espero que mientras la secuencia de comandos esté tardando, todo lo que se ha hecho hasta ahora se mostrará en la pantalla (en el navegador). Pero no se publica nada hasta el final. ¿Qué me estoy perdiendo?ob_flush
vacía los búferes de salida que creó con una función comoob_start
flush
descarga la salida almacenada en búfer del propio script PHP a su llamadorfuente
ob_flush()
es una descarga de alto nivel. Vacía los búferes de alto nivel y coloca todo el contenido en los búferes internos de bajo nivel listos para enviar.ob_
familia de funciones crea pilas de búferes, por lo que escribir a ciegas enob_flush()
todas partes le dará "resultados extraños" si el código se escribió para aprovechar esta acumulación.flush()
es un vaciado de bajo nivel, que indica a PHP que vaciar sus búferes de datos internos de bajo nivel.Aún debajo de eso, habrá búferes de capa de socket; debajo de eso, hay búferes de capa de red. Y, en el nivel más bajo, la cola de electrones bajando por el cable de datos.
fuente
ob_start()
y unob_end_clean()
al comienzo del guión. Luego, después de cualquier "eco" durante la secuencia de comandos, también incluyoob_flush(); flush();
, y espero que mientras la secuencia de comandos esté tardando, todo lo que se ha hecho hasta ahora se mostrará en la pantalla (en el navegador). Pero no se publica nada hasta el final. ¿Qué me estoy perdiendo?Supongo que esto está en relación con su pregunta anterior . La ventaja significativa de usar el almacenamiento en búfer de salida es cuando se usa junto con la compresión de datos. Si no está consumiendo
ob_gzhandler
, hay poco que ganar.flush
solo confirmará los datos de salida que aún estén en el servidor. Conob_start
y sus contrapartesob_flush
,ob_end_clean
yob_end_flush
lo que esté esperando ser comprimido (mireflush
yob_flush
como referencia a diferentes cubos,ob
envía datosflush
,flush
envía datos al navegador, puede no ser exacto, pero esa es la idea) se empaquetará y enviará al cliente. .fuente