2009-06-08 16 views

Respuesta

8

No. Los clientes deben "sondeo" el servidor repeatadly.

Creo que la clave aquí es pensar en el diseño de interacción. El truco es engañar al usuario para que piense que el chat es instantáneo, pero cuando en realidad se actualiza una vez cada 1 o 2 o 3 o 10 segundos.

Ideas:

1) Cuando el usuario envía un mensaje, muestran directamente en el chat y desencadenan una encuesta.

2) Si una encuesta vuelve con mensajes múltiples de otros usuarios, no los agregue todos a la vez, en realidad agréguelos durante un período de 1-2 segundos o más, con espacios aleatorios, para que se vea como si entrará "instantáneamente" e independientemente.(Si entran varios mensajes al mismo tiempo, el usuario se da cuenta rápidamente de que el chat se actualiza en ese momento, y no continuamente.)

3) Si el usuario está inactivo durante x cantidad de tiempo. Deja caer la tasa de encuesta una vez cada 10 segundos más o menos.

4) Si el usuario está activo, es decir, envía un montón de mensajes, sondea más a menudo.

5) Tenga un archivo estático para cada canal que escriba la hora en que se actualizó por última vez el chat. Por ejemplo, el archivo chat-teenfun-lastupdate.txt tiene los contenidos 1224934239 o el formato de hora que prefiera. Sirva este archivo de forma estática y permita que los clientes sondeen este archivo para verificar si el canal se ha actualizado, en lugar de llamar al chat-poll.php?ch=teenfun que hace una comprobación dinámica. Los archivos estáticos se publican entre 10 y 100 veces más rápido, según el trabajo que implica el script dinámico, y lo necesitarán cuando obtenga más de 250 usuarios encuestando.

¡Buena suerte y diviértete!

/0

PS. Alternativamente, podría permitir a los clientes hacer una llamada ajax al servidor y mantenerlos 'colgados'. Es decir, aceptas su solicitud y pretendes comenzar a enviar datos de vuelta, pero luego pausas. Cuando algo sucede, finaliza la respuesta con los datos correspondientes. Para que esto funcione, creo que necesitarías escribir tu propio servidor HTTP, eso lo hace específicamente, ya que no puedes tener 250 procesos php en la memoria. Tal vez Lighttpd podría usarse de esta manera de alguna manera con ese mod de caché LUA. No lo sé. Sin embargo sería interesante Demonios, tengo que intentarlo alguna vez :)

1

Mientras no existe no es la tecnología push HTTP nunca se tiene un chat en tiempo real utilizando sólo JavaScript.

workarrounds posibles:

  • utilizan una película Flash o una Java Applet para realizar algún tipo de comunicación toma
  • solicitudes de reserva de votación de nuevo en el lado del servidor durante unos segundos
+1

¿Sabía que aquí hay algunos ejemplos de la vida real de tales cosas en PHP/JS? También estoy escribiendo uno para mi trabajo, sí, tiene sus limitaciones, pero no es imposible. Incluso sin tecnología de empuje. – elcuco

+0

en tiempo real significa para mí en tiempo real (excepto la velocidad de conexión) ... pero tienes razón: hay muchas cosas fuera que realmente parecen como en tiempo real ... – TheHippo

+0

Creo que este es el enfoque que usa Facebook Messenger.No es necesariamente tan elegante como un enfoque convencional de cliente-servidor, tal vez, pero hace el trabajo bien. – Rob

6

de que hay , pero no creo que sea muy eficiente con muchos usuarios. Puede hacer una encuesta donde cada cliente sondea el servidor para ver si hay mensajes nuevos, o puede usar el comet technique en el que el servidor puede enviar mensajes nuevos a los clientes. Consulte el Comet plugin for XAJAX. Cómo podría implementarse esto usando XAJAX y PHP está más allá de mí, pero así es como trataría de implementarlo.

Que cada cliente conectarse al servidor (iniciar sesión, etc), entonces:

  1. Para cada mensaje enviado por un cliente (emisor) actualizar la cola de mensajes para el cliente (receptor)
  2. Vamos servidor de sondeo de cliente para nuevos mensajes en la cola/Empuje los nuevos mensajes vía cometa.
  3. actualización de interfaz gráfica de usuario si hay mensajes nuevos.
  4. enjuague, espuma, repita

Usando un verdadero servidor de mensajería instantánea como ejabberd podría recorrer un largo camino, ser más eficiente y permitir a sus usuarios conectarse a través de clientes de escritorio (si eso es lo que quiere). Probablemente usaría eso como un backend, IOW ejabberd sería el servidor y PHP sería el cliente que usa XMPP in PHP, y actuaría como proxy para el webgui.

Consulte también:
Google Techtalk on Gmail's chat feature (and scalability issues)

Esa es mi $ 0,02

0

La mejor estrategia que he visto es hacer una solicitud de mensajes AJAX y luego reiniciar esa misma solicitud tan pronto como termine.

En el lado del servidor, haga que el script "se detenga" durante 60 segundos o hasta que se reciba un nuevo mensaje. Esto mantiene la misma conexión abierta durante un máximo de 60 segundos, pero cuando se recibe un nuevo mensaje, lo emite y se detiene de inmediato, lo que provoca que el AJAX del lado del cliente abra otra conexión.

Esto proporciona una notificación casi instantánea de los mensajes nuevos y también es mucho más fácil en el servidor que hacer una nueva conexión cada x segundos.

1

Puede usar websockets, pero al ser una nueva característica de HTML5, es algo limitada. Por suerte para ti hay socksjs, que implementa websockets en navegadores que no lo manejan.

En el lado del alojamiento, debería poder usar cualquier servidor websockets, hay algunos para PHP.

+0

literalmente no hay un navegador importante que no admita websockets: http://caniuse.com/#feat=websockets – specializt

1

Si está buscando implementar un servidor de chat escrito con un lenguaje de scripting como PHP/JSP, la técnica de colgar la conexión HTTP deberá estar marcada en su lista de opciones. La razón es que a la mayoría de los servidores web (especialmente los servidores compartidos) no les gusta que cuelguen demasiadas conexiones.

Puede encontrar todo lo que necesita para implementar un cliente web y un servidor de chat PHP en esta publicación "Optimized Chat Server Protocol for Server Side Scripting Languages".

Cuestiones relacionadas