PHP Flush () no funciona en Chrome

Me encontré con esta función que prometía funcionar en IE, FF y Chrome. Pero no funciona en Chrome. Hay un trabajo alrededor?

function buffer_flush(){ echo str_pad('', 512); echo ''; if(ob_get_length()){ @ob_flush(); @flush(); @ob_end_flush(); } @ob_start(); } 

Solutions Collecting From Web of "PHP Flush () no funciona en Chrome"

Así es como obtuve flush () trabajando en un ciclo while en Chrome 12.0.742.122 con PHP 5.3.6:

 echo(""); while(1) { echo(str_pad($my_string_var,2048," ")); @ob_flush(); flush(); } 

Usar un valor str_pad menor también funcionaba, pero demoraría un poco más en aparecer la primera salida. Si faltaba alguna de las otras líneas, no aparecería nada.

La “@” no es estrictamente necesaria, pero evita que el registro se llene con avisos de “nada en el búfer”.

Y, por supuesto, si tiene una página preexistente, solo asegúrese de que las tags y estén ahí; Estaba escribiendo una página desde cero.

Con flush() / ob_flush() solo envía la salida al navegador, pero aún está en el navegador, cuando lo muestra. Supongo que Chrome solo espera, hasta que tenga suficientes datos recibidos para mostrar una página “útil”, en lugar de algunos fragmentos.

Algunas sugerencias de todos modos:

  • Evita usar @ (especialmente si no sabes exactamente lo que hace)
  • Si no llama a ob_end_*() , no necesita volver a llamar a ob_start() . Es ineficiente

     function buffer_flush(){ echo ''; // ? ob_flush(); flush(); } 

Algunos navegadores (IE6 por lo menos, y posiblemente Chrome) requieren una cierta cantidad de caracteres “útiles” (es decir, no espacios) antes de dar salida a algo. En el caso de IE6, incluso es el tamaño de los datos comprimidos que debe ser empujado.

 function force_flush() { echo "\n\n\n\n"; for ( $i = 0; $i < 5; $i++ ) echo "\n\n"; while ( ob_get_level() ) ob_end_flush(); @ob_flush(); @flush(); } # force_flush() 

Hay varios componentes que pueden tener un impacto en este tema.

Lea detenidamente la documentación de esta función: http://www.php.net/manual/en/function.flush.php

Una solución que tuve fue utilizar Apache2 con mod-php (no como fcgi sino como apache-module nativo) y Chromium. El resultado vino inmediatamente y el script aún se estaba ejecutando y enviando más resultados.

Después de escribir las siguientes dos líneas de código, cada echo-command inmediatamente empujará el texto al back-end de PHP :

 ob_implicit_flush(1); @ob_end_flush(); // set an end to the php-output-buffer! 

Pero este back-end php puede tener su propio buffer. Por ejemplo, ejecuto nginx como servidor web y php es utilizado por el módulo fast-cgi. Nginx tiene su propio buffer … y así sucesivamente.

El navegador también puede almacenar la solicitud. Pero a medida que experimento Chromium (o Google Chrome) tiene un buffer muy pequeño o nulo.

Lea la documentación de cada función que mencioné para comprender lo que realmente hacen, pero especialmente la documentación de flush () .

Consejo personal: No coloque caracteres adicionales en el buffer de salida, pero lea y comprenda la configuración de su servidor.

EDITAR: si tiene habilitado gzip, la respuesta completa del servidor se almacenará en el búfer.

Descubrí que un encabezado de tipo de contenido realmente lo hace funcionar en Chrome después de algunas pruebas y errores.

Pero no sé por qué Chrome no funciona de otra forma.

Después de buscar más respuestas, leí que Chrome se vacia como espera solo cuando se configura un tipo de contenido válido. multa.

Aquí está el código que experimenté.

 < ?php header('Content-Type: text/html; charset=UTF-8'); echo 'starting...'; flush(); echo 'to sleep...'; flush(); sleep(5); echo 'awake'; 

Si no incluyo el encabezado del tipo de contenido, obtengo lo siguiente en una toma luego de 5 segundos. entonces, lo que esperamos no funcionó.

comenzando ... a dormir ... se muestra despierto y la secuencia de comandos finaliza.

donde cuando di el tipo de contenido como el anterior con el subtipo (juego de caracteres)

Comenzando ... a dormir ... se muestra de inmediato y luego después de 5 segundos se muestra el mensaje de alerta.

simplemente estoy asumiendo ciegamente que con respecto al encabezado de tipo de contenido, Chrome muestra el resultado.

Además, cuando di 'Content-Type: text / plain' o 'Content-Type: text / html' no funcionó. funcionó solo con el subtipo 'charset = [sometexthere]'.

fueron como la aplicación / json funcionó. y no experimenté con más mimos.

La razón por la que estoy aquí es

quería usar readystate 3 en la respuesta ajax. funciona bien excepto cromo y safari. ya que Chrome está usando webkit es lo mismo en ambos, creo.

en otros navegadores, incluido IE, el enrojecimiento funciona como se esperaba y también el estado listo = 3, pero en cromo y safari acabo de utilizar la solución anterior.

aquí está la captura de pantalla del readystate - responsetext del script php anterior

enter image description here

en la imagen hay dos conjuntos de respuesta, el primero con readystate 3 y responsetext como vacío cuando no se utiliza el tipo de contenido.

en la segunda respuesta puede ver que el estado listo 3 tiene texto de respuesta con el resultado esperado. esto es cuando se usa el tipo de contenido.

entonces ... Chrome solo sabe.

cuando se usa str_pad

Cuando utiliza relleno de cadena, puede obtener más resultado esperado. Intenté con 1024 como se sugirieron las respuestas anteriores, pero solo con el tipo de contenido configurado.

si se usa relleno y no se establece ningún tipo de contenido, entonces no funcionó.

y

He planteado una pregunta similar a esta y voy a agregar mi propia respuesta vinculando esta respuesta a eso y de vuelta a la parte posterior ... para que sea más fácil para los usuarios obtener más detalles. hhmmm.