2012-05-08 21 views
5

Un script php grande usa flush para enviar una parte del html generado al navegador mientras está ejecutando la mayor parte del script que toma aprox. 20 segundos.¿Por qué PHP Flush no siempre funciona, la página 1/5 veces no se carga correctamente?

La parte del script que se está ejecutando después de la descarga es bastante grande y requiere mucho de las reservas del servidor (90% de CPU).

Una vez cada 5 veces, la página permanece en blanco (blanco), lo que significa que el color no llegó para enviar la imagen que muestra que la página se está cargando. La página permanece en blanco (el navegador indica que todavía se está cargando) también cuando el programa está terminado y debe enviar toda la página al navegador.

Notable: Cuando presiono el botón Atrás, se mostrará toda la página (que debería haberse cargado en el navegador después de que se ejecuta el script completo) por un segundo y luego el navegador volverá a la página anterior.

Las otras 4 veces la página se carga bien. La entrada para el script php es la misma para las 5 veces.

tengo esta configuración en mi archivo .htacces:

addhandler x-httpd-php5-cgi .php5 
addhandler x-httpd-php5-cgi .php5 
addhandler x-httpd-php5-cgi .php5 
Header Set Cache-Control "max-age=0, no-store" 

Esta es la declaración para eliminar el código generado en el navegador:

print str_pad('',4096)."\n"; 
ob_flush(); 
flush(); 

¿Cuál podría ser la causa de este problema?

+0

Bonita historia, ¿dónde está el código? –

+0

@LawrenceCherone Agregué el código que va al navegador. – BastiaanWW

Respuesta

2

Solo puede insinuar: flush() lo envía a apache/servidor web, que puede almacenar/esperar, que lo envía a la red con cualquier cantidad de proxies que puedan almacenar/esperar, que finalmente termina en su navegador, que también puede decidir almacenar/esperar. Vaya por un método asincrónico si no quiere lidiar con todos esos dolores de cabeza. Gearman lo hace muy fácil, pero no estrictamente necesario, por supuesto.

2
print str_pad('',4096)."\n"; 

¿Notaste que estás repitiendo una cadena vacía? Tal vez te referías

print str_pad(' ',4096)."\n"; 

el propósito de que la declaración se debe a que algunos navegadores web, no representar la página hasta que se haya recibido una cierta cantidad de bytes, o la respuesta es completa, lo que ocurra primero.

Cuestiones relacionadas