Foros del Web » Programando para Internet » PHP »

Chat de dos y long polling

Estas en el tema de Chat de dos y long polling en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 05/10/2012, 03:31
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 12 años
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.
  #2 (permalink)  
Antiguo 05/10/2012, 06:53
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Chat de dos y long polling

consideraciones:

1 - long polling implica mantener la conexión con el cliente, por lo que es necesario ese ciclo infinito y que se interrumpa a la hora que el server "detecte" cambios y así envíe la respuesta, el sleep de 3 segundos es innecesario,a lo sumo eliminarlo o colocale 1 segundo.

2 - se hace una petición normal, pero al obtener la respuesta se vuelve a hacer la petición, ese es el ciclo básico del cliente, no posteaste esa parte.

3 - ten en cuenta que long polling sólo aligera el ancho de banda, pero implica un esfuerzo grande para el servidor, por lo que si el tráfico es elevado tampoco funcionaría como se espera, por los momentos en PHP no es posible crear un servidor propio multi-threading (esperemos que se implemente en las futuras versiones, al menos en PHP 5.4 ya se dispone de server http propio) por el cual no te permitirá optimizar el lado del servidor con técnicas como HTML5 WebSocket, en cambio con node.js tienes eso ya preparado, claro, depende de tí si quieres aventurarte, aunque existen otras alternativas de pago como APE, lo que no sé es si disponga de una api para PHP, saludos.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 05/10/2012, 09:37
 
Fecha de Ingreso: abril-2012
Mensajes: 63
Antigüedad: 12 años
Puntos: 2
Respuesta: Chat de dos y long polling

Muchas gracias por la respuesta.
1.-Colocaré el sleep en 1 segundo.
2.-Sí. En la parte de ajax ya tenía como callback reiterada la petición, gracias por apuntarlo.
3.-Había leído lo que comentas, que en casos de tráfico elevado apache puede petar en cualquier momento. Supongo que saber a priori el listón a partir del cual estamos en la línea roja será complicado y dependerá de muchas cosas, ¿no?

Me he mirado un poco a distancia lo de node.js, pero por un lado me tira un poco para atrás, y por otro es que tengo ya casi acabada la web, y rehacerla me da como pereza (espero no tener que arrepentirme en el futuro)

Lo dicho, gracias por aclararme los conceptos.

Etiquetas: chat, long, polling, tabla, variables, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:44.