2010-03-04 17 views
6

Necesito una solución para esto.
aquí es sólo una parte de mi códigoecho/print problema en php while loop

<?php 
$number = 30; 
while($number > 0) { 
$number--; 
sleep(30); 
print "$number . Posted<br>"; 

} 
?> 

El proceso de bucle en el bucle es en realidad mucho más grande, acabo de poner las cosas importantes.

De todas formas como se puede ver que debe imprimir
30 publicado
(esperar 30 segundos)
29 Publicado
(Espere 30 segundos)
28 Publicado
(esperar 30 segundos)

Pero en su lugar, espera hasta que termina el ciclo, luego simplemente lo imprime todo de una vez. ¿Hay una solución para esto? Estaba pensando en un método ajax, pero no sé de ninguno.

Respuesta

15

Agradable que todos explicaron por qué.

Esto se debe a que, por defecto, PHP procesará todo antes de que se "vacíe" algo en el navegador. Al imprimir cada línea, está almacenando esa información en el búfer que se imprimirá simultáneamente una vez que PHP haya terminado de ejecutarse.

Si desea que PHP descargue ese contenido al explorador inmediatamente después de la línea, debe llamar al flush() después de cada uno, y luego emitirá el texto una línea a la vez después de cada llamada.

+0

+1 para proporcionar una buena explicación. – GSto

4

Llamada flush() después de la impresión.

0

Es posible poner en \necho o print a vaciar el búfer.

1

Un ejemplo de un bucle con flush() es

<?php 
ob_start(); 
for ($i = 0; $i < 10; $i++) 
{ 
    echo "<div>" . time() . ": Iteration $i</div>"; 
    sleep(1); 
    ob_flush(); 
    flush(); 
} 
ob_end_flush(); 
?> 

No debe enjuagar a menudo porque se fuerza php para procesar los mensajes y esto aumentará el tiempo de ejecución.