2012-03-15 19 views
5

Tengo un objeto para tareas y en __deconstruct(), está destinado a ejecutar algunas de las tareas de limpieza más largas después de que el resto de la página ya se haya cargado. Desafortunadamente, almacena el resultado y no lo enviará hasta después de que las tareas hayan finalizado (no se imprime nada en las tareas).Deshabilitar el búfer de salida en PHP

He leído http://www.php.net/flush y he intentado todas las sugerencias allí. Obviamente, he intentado deshabilitar output_buffering en php.ini. He inhabilitado deflate_module, la compresión de zlib está desactivada, no tengo mod_gzip. Llamar a flush() o ob_flush() no tiene ningún efecto ni habilitar implicit_flush.

Estoy ejecutando XAMPP (actualmente apache 2.2.17, php 5.3.4) en Windows Server 2008 R2. PHP se está ejecutando como un módulo.

Y sí, podría configurar un poco de hack AJAX para ejecutar el administrador de tareas o incluso configurar una tarea programada para ejecutar esta tarea específica, pero el almacenamiento en búfer de salida también ha sido un problema en otros lugares. Me gustaría que se fuera a veces.

Desde un mismo hilo, alguien sugirió ver lo que haría lo siguiente:

<?php 
while (TRUE) 
{ 
    echo 'x'; 
    flush(); 
    sleep(1); 
} 
?> 

Como era de esperar, la página se muestra nada hasta el tiempo de ejecución máximo se alcanza, en cuyo punto se vacía el búfer.

Esto se ha vuelto extremadamente frustrante. ¿Alguien tiene alguna idea de lo que todavía podría estar causando que amortigüe?

+0

¿Puedes confirmar que la salida todavía se está almacenando en el buffer vs. el navegador simplemente no muestra nada (por ejemplo, IE no mostrará nada hasta que reciba cierta cantidad de bytes)? –

+0

hace esta función http://php.net/manual/en/function.ob-get-level.php return 0? – dqhendricks

+0

puede intentar esto si ayuda http://in3.php.net/manual/en/function.ob-end-flush.php –

Respuesta

4

Solo está enviando una pequeña cantidad de datos. Los navegadores tienen su propio búfer, que puede basarse en una cantidad de bytes, por los cuales se han recibido los elementos, o por otra cosa.

En resumen, no hay nada que puedas hacer al respecto. El almacenamiento en búfer está sucediendo en el lado del cliente, no en el lado del servidor. Puedes intentar enviar más datos antes de x s.

Puede probar esto por paquete olfateando la conexión entre el servidor y el navegador, con Wireshark o similar.

+0

Bueno, iba a decir que estaba enviando un poco de datos antes, pero al cambiarlo a por ($ i = 0; $ i <10000; $ i ++) {echo 'x
'; sleep (1) }, sale bien. Supongo que la única solución sería enviar más datos para obligar al navegador a mostrarlo. Puede que no sea ideal. Gracias, sin embargo. Seguí revisando mis scripts y configuraciones y me estaba volviendo loco. – Apropos

+0

IE es conocido por esto. Yo engañé a IE enviando alrededor de 1000 espacios justo antes de enjuagar. Debido a que HTML combina espacios, no importa. – nalply

4

Hmmm, interesante agarró un recorte de código que he utilizado en otro lugar y funciona como se esperaba ...

https://stackoverflow.com/a/9728519/632951 

<?php 
echo str_repeat('fillerbytes',20*1024/strlen('fillerbytes')); 
echo '<body style="font-size:6px;font-family:arial;">'; 
echo str_repeat('<br>',2); 
    for($i=1; $i<=5000; $i++){ 
     echo $i . ' '; 
     ob_flush(); 
     flush(); 
     usleep(2000); // 2 ms each = 10s total 
    } 
?> 

Mira mi número de servidores a 5000 http://atwebresults.com/texttest/new.php

(no funciona en algunos hosts libres como freehostingeu.com)

+0

Sí, esto funciona. Lamentablemente, es solo porque está enviando muchos más datos de los que quería enviar. Al cambiar el tiempo entre iteraciones a 1 en lugar de .001, se produce el retorno del comportamiento no deseado. – Apropos

+0

Esto me hace el día. Creo que funciona debido al uso de ob_flush(); en lugar de flush(); – Alrik

+0

Se debe a la cantidad de datos enviados, no ob_flush(). El ejemplo original falla incluso cuando se agrega ob_flush(), o este falla cuando se cambia el tiempo entre iteraciones a 1 en vez de una milésima de segundo como lo es actualmente. – Apropos

Cuestiones relacionadas