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 ciegamenteob_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