2009-08-10 7 views
6

He notado que algunos de mis sitios ajax-heavy (los que visito, no los que he construido), tienen ciertas características de actualización automática. Por ejemplo, en GMail, si recibo un mensaje nuevo, veo el nuevo mensaje sin una nueva página. Es lo mismo con el cliente de mensajería instantánea basado en navegador de Facebook. Por lo que puedo decir, no hay ningún applet de Java que maneje el enlace del servidor-navegador, así que me queda asumir que lo está haciendo AJAX y quizás algún elemento que desconozco. Así que por mi mejor conjetura, se hace en una de dos maneras:Reverse AJAX? ¿Los cambios de datos pueden ser 'EMPUJADOS' al script?

  1. El javascript hace un "ping" constante a un script del lado del servidor, comprueba si hay actualizaciones que podrían estar disponibles (lo que explicaría por qué algunos de estas páginas pone a punto cualquier otra página de servicio pesado). o

  2. El javascript se queda sin hacer nada y un script del lado del servidor realmente "empuja" las actualizaciones del navegador. Pero no estoy seguro si esto es posible. Me imagino que hay algún tipo de función AJAX que todavía suena, pero todo simplemente pregunta "¿Alguna actualización?" y el script del servidor tiene un booleano simple que dice "nope" o "me complace que haya preguntado". Pero si este es el caso, cualquier cambio en los datos necesitaría llamar al script directamente para que tenga listos los cambios en los datos y haga el cambio a esa función booleana.

¿Es eso posible/factible/cómo funciona? Imagino algo como:

Alguien envía una actualización de correo electrónico/IM/DB al servidor, el servidor llama al script usando la URL del script más alguna variable GET relevante, el script toma nota del cambio y actualiza la variable "actualizaciones disponibles" , el AJAX recibe la respuesta de que de hecho hay actualizaciones, AJAX ejecuta sus funciones normales de "página de actualización", que ejecuta los scripts de actualización normales y los envía al navegador.

Lo pregunto porque parece realmente ineficiente que el js solo haga una comprobación constante que requiere a) que el servidor haga el trabajo cada 1,5 segundos, yb) que mi navegador funcione cada 1,5 segundos solo para que en mi extremo Puedo decir "¡Oh chico, tengo un mensaje instantáneo! ¡Como un verdadero cliente de mensajería instantánea!"

Respuesta

6

leer sobre Comet

+0

Guau, incluso utilicé las mismas frases. eso es casi embarazosoPero mi búsqueda inicial sobre cómo hacer esto en PHP menciona infinitos scripts de bucle. ¿Tiene que producirse un ciclo infinito en algún lugar a lo largo de la línea para que funcione este tipo de cosas? ¿Por qué el origen de datos modificado real (servidor IMAP, base de datos, archivo txt, lo que sea) no puede activar el script para reactivarlo y manejarlo? – Anthony

0

De hecho, he estado trabajando en un pequeño Web .NET aplicación que utiliza el Ajax con la técnica de sondeo largo descrito.

Dependiendo de la tecnología que esté utilizando, podría utilizar mecanismos de señalización de subprocesos para mantener su solicitud hasta que se recupere una actualización. Con ASP.NET estoy ejecutando mi servidor en una sola máquina, así que almaceno una referencia a mi objeto Producer (que contiene un hilo que procesa los datos). Para iniciar la extracción de datos, se llama al método de suscripción de mi servicio, que crea un objeto de consumidor que está registrado con el productor. Si el consumidor es el modo de votación larga, tiene un evento AutoResetEvent que se señaliza cada vez que recibe datos nuevos, y cada vez que el cliente web realiza una solicitud de datos, el consumidor primero espera el evento de restablecimiento y luego lo devuelve.

Pero está mencionando algo sobre PHP: hasta donde sé, la persistencia se mantiene mediante la serialización, no manteniendo realmente el objeto en la memoria, así que no sé cómo podría hacer referencia a un objeto Productor usando $ _CACHE [] o $ _SESSION []. Cuando me desarrollé en PHP, nunca supe nada sobre el multihilo, así que no jugué con él, pero supongo que puedes investigarlo.

El uso de bucles infinitos va a consumir una gran parte de su potencia de procesamiento; antes agotaría todas las otras opciones.

Cuestiones relacionadas