Ver Mensaje Individual
  #1 (permalink)  
Antiguo 05/10/2012, 03:31
roncco
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 12 años, 7 meses
Puntos: 2
Chat de dos y long polling

Estoy montando una especie de chat y, aunque lo he probado y funciona, me surge la duda si mirándolo desde el rendimiento la opción que he escogido es la mejor. Os explico los requerimientos:

Es una web donde cada usuario puede acceder a una sala privada de chat propia. En esa sala de chat sólo podrá estar él y otro usuario al que invite (no sé si un chat donde sólo pueda haber dos personas es puramente un chat, pero eso es otro tema).

El caso es que al 'pertenecerle' a cada usuario una sala de chat, se me ocurrió que en la tabla de ese usuario en la base de datos podía almacenar la conversación en curso (cuando se cierra el chat se borra, por supuesto). Ese texto almacenado (al que repito, sólo accederán el propietario de la sala y su invitado) se muestra vía ajax en el div correspondiente.

Como por lo que he leído en este foro a gente que sabe muchísimo más que yo el sistema de ir tirando de setinterval (el polling de toda la vida) no es la panacea, y dado que soluciones más elaboradas (node.js y similares) se quedan fuera de mis capacidades intelectuales, opté por lo que he visto que venís llamando como long polling. Y este sería el script en php:

Código PHP:
Ver original
  1. <?php
  2. header("Cache-Control: no-store, no-cache, must-revalidate");
  3. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  4.  
  5. /*El método leerChat devuelve el texto de TODA la conversación almacenada en bd en el campo de el usuario propietario de la sala*/
  6.  
  7. $texto_a_mostrar = Chat::leerChat($idAnfitrion);
  8.  
  9. /*Almaceno los últimos treinta caracteres en una variable*/
  10.  
  11. $extracto = substr($texto_a_mostrar, -30);
  12.  
  13. /*inicio el bucle. Establezco una comparación vía variable de sesión para comprobar si ha habido alguna variación entre la última llamada, y en caso afirmativo se muestra*/
  14.  
  15.  
  16. while(1){
  17.     if($extracto != $_SESSION[$canal]){
  18.            
  19.             echo $texto_a_mostrar;
  20.         $_SESSION[$canal]= $extracto;
  21.             break;
  22.     }
  23.  
  24.     sleep(3000);
  25. }
  26.  
  27.  
  28. ?>

Seguramente os parecerá un poco (o bastante) rudimentario, pero al nivel que estoy no doy para mucho más. No sé si estoy aplicando el long polling de manera correcta o si podría mejorar algo. En fin, que cualquier sugerencia será bienvenida.