El tema de ir enviando salida al navegador a medida que esta se genera es algo complicado. La cuestión es que en el envio de estas salidas intervienen los servidores y navegadores, y cada uno hace cosas diferentes con ella. Como puedes ver en
http://ar2.php.net/flush y también en los comentarios de esa misma documentación, existen varias "soluciones" al problema... algunas les funcionan a algunos mientras que esas mismas soluciones no les funcionan a otros tantos.
Lo que yo he utilizado en cierta ocasión y hasta ahora no me ha dado problemas es algo como lo siguiente:
Código PHP:
<?php
ob_start();
for($i=0; $i<=4; $i++)
{
echo $i.'<br>';
enviarSalida();
sleep(1);
}
function enviarSalida()
{
if(ob_get_length()<=8192) echo str_pad('', 8192-ob_get_length());
ob_flush();
}
?>
El problema es que para que la salida sea realmente mostrada en el momento requerido si lo que hay que mostrar tiene una longitud menor a 8192 caracteres se utiliza un relleno para llegar a esta cantidad, aunque este relleno no se muestre en lo que ve el "usuario final". Lo ideal sería entonces que llames a enviarSalida() cada 4 o 5 registros para no tener que enviar tanto relleno innecesario.
Como te digo, hay varios factores que intervienen en el proceso y cada uno de ellos se comporta de manera distinta; esta es la forma que encontré yo que funciona en Win/Linux y en Opera/Firefox/IE. Puedes ver más en el link que te pasé más arriba.
Saludos.