Búfer de salida en PHP

Intentando programar un pequeño php que, usando phpmailer, mande correos a una lista de destinatarios con cierta información irrelevante me surgió un pequeño problema que paso a describir. Durante el envío debía comprobar por pantalla y uno a uno los correos erróneos o incapaces de entregarse sacando un informe del motivo.

El esquema empezó siendo algo sencillo, esperando un segundo entre envío y envío para no recargar el servidor de correos, algo así como:
for($i=0;$i<=$cuenta;$i++)
{
	$err=mail($remitente,$asunto,$contenido,$destinatario[$i]);
	if($err)
		echo "Ha ocurrido un error con {$destinatario[$i]}";
	else
		echo "Correo enviado satisfactoriamente a {$destinatario[$i]}";
	sleep(1);
}
La idea era buena y en una lista de destinatarios que no supere los 3 items, despistándonos un poco, podría valer. Pero si se pretende enviar masivamente clientes, pos va' ser que no. Pensé que la información se iría mostrando poco a poco en pantalla y estaba equivocado, en una lista de 10 destinatarios los registros de errores y no_errores se muestran después de 10 segundos (más el tiempo suplementario en mandar el correo), de golpe y porrazo. La solución está en las funciones flush() y ob_flush() que, hasta hace poco, desconocía:
if($err)
	echo "Ha ocurrido un error enviando correo a $destinatario[$i]";
else
	echo "Correo enviado satisfactoriamente a $destinatario[$i]";
flush();
sleep(1);
flush() se encarga de vaciar el buffer de salida de PHP, mostrando uno a uno cada mensaje. Un efecto parecido a lo que se haría con Ajax o Javascript Avanzado pero con una simple función PHP, creo que jugando un poco más con esta función se pueden hacer cosillas 2.0... o no :D.

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.