Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/08/2012, 05:30
xuturk
 
Fecha de Ingreso: mayo-2011
Mensajes: 74
Antigüedad: 13 años
Puntos: 2
Pregunta Problema con el famoso Flush() y Ajax

Buenas a todos.

Estoy teniendo problemas al intentar hacer un chat en php con Ajax por algo que segun veo por internet buscando es bastante comun que pase, y que mientras mucha gente lo ha resuelto yo no he conseguido nada aun :S..

La cosa es que el chat se conecta correctamente y mediante Ajax (usando Jquery) se lanza la llamada asincrona que va a un bucle infinito el cual si hay mensajes nuevos les envia mediante echo(.... y justo despues de este echo hace un flush para que supuestamente lo reciba Ajax y lo pinte en pantalla, la cosa es que no lo hace hasta que sale del bucle, cosa que es logica pero no es el funcionamiento que quiero, si no que en cada iteracion del bucle javascript reciba ese echo y lo dibuje.

He probado modificando el php.ini con output_buffering = off


y en el documento .php que tiene el bucle infinito he puesto al principio lo siguiente:

Código:
@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
y nada por ahora.

El codigo javascript es el siguiente:

Código:
function conectarChat()
{
	$.ajax({
			type: "POST",
 		  	url: "scripts/php/xchatservercore.php",
   			data: "user=xuturk",
   			complete: function(jqXHR, textStatus) 
    		{
      		alert(textStatus.responseText);
    		},
   			success: function(msg)
			{
			alert(msg);
				//Si llegamos aqui quiere decir que el chat se ha desconectado.
				chatConectado = false;
				$("#lblstatus").html("Chat Desconectado"); 
    		},
    		error: function()
    		{
    			alert("Error de conexion");
    		}
  		});
  		chatConectado = true;
  		$("#lblstatus").html("Chat Conectado"); 
}
Como veis unicamente quiero que salte el mensaje para ver que funciona, con eso me vale.

Y el codigo php del bucle es el siguiente:

Código:
	//Una vez conectado configuramos el bucle infinito:
	set_time_limit(0);
	header("Edge-control: no-store");
	echo("Entrando");
	flush();
	ob_flush();
	//Bucle infinito que escucha nuevos mensajes:
	while($userconnected)
	{
		ob_start();
		//Mientras comprobamos si hay mensajes nuevos:
		echo("asdf");
		ob_flush();
		flush();
		sleep(1);
	}
Espero que me podais echar una mano.

Muchas gracias.

Un saludo.