recibir quiero que notificaciones mis mensajes los lleguen llegan las desactivar cómo correo como comet

comet - notificaciones - quiero que me lleguen los mensajes de facebook a mi correo



¿Cómo Facebook, Gmail envía la notificación en tiempo real? (5)

He leído algunas publicaciones sobre este tema y las respuestas son cometa, ajax inverso, transmisión de http, servidor push, etc.

¿Cómo funciona la notificación de correo entrante en Gmail?

¿Cómo puede GMail Chat hacer solicitudes AJAX sin interacción con el cliente?

Me gustaría saber si hay alguna referencia de código que pueda seguir para escribir un ejemplo muy simple. Muchas publicaciones o sitios web solo hablan de la tecnología. Es difícil encontrar un código de ejemplo completo. Además, parece que se pueden utilizar muchos métodos para implementar el cometa, por ejemplo, Hidden IFrame, XMLHttpRequest. En mi opinión, usar XMLHttpRequest es una mejor opción. ¿Qué piensas de los pros y los contras de los diferentes métodos? ¿Cuál utiliza Gmail?

Sé que necesita hacerlo tanto en el lado del servidor como en el del cliente. ¿Hay algún código de muestra de PHP y Javascript?


Actualizar

Mientras continúo recibiendo votos positivos sobre esto, creo que es razonable recordar que esta respuesta tiene 4 años. La web ha crecido a un ritmo muy rápido, así que ten en cuenta esta respuesta.

Recientemente tuve el mismo problema e investigué sobre el tema.

La solución dada se denomina sondeo largo, y para usarla correctamente, debe asegurarse de que su solicitud AJAX tenga un tiempo de espera "grande" y para realizar esta solicitud siempre después de que finalice el actual (tiempo de espera, error o éxito).

Encuesta Larga - Cliente

Aquí, para mantener el código corto, usaré jQuery:

function pollTask() { $.ajax({ url: ''/api/Polling'', async: true, // by default, it''s async, but... dataType: ''json'', // or the dataType you are working with timeout: 10000, // IMPORTANT! this is a 10 seconds timeout cache: false }).done(function (eventList) { // Handle your data here var data; for (var eventName in eventList) { data = eventList[eventName]; dispatcher.handle(eventName, data); // handle the `eventName` with `data` } }).always(pollTask); }

Es importante recordar que (de jQuery docs ):

En jQuery 1.4.x y más abajo, el objeto XMLHttpRequest estará en un estado no válido si la solicitud se agota; El acceso a cualquier miembro objeto puede lanzar una excepción. Solo en Firefox 3.0+, las solicitudes de script y JSONP no pueden cancelarse por un tiempo de espera; la secuencia de comandos se ejecutará incluso si llega después del período de tiempo de espera.

Encuesta Larga - Servidor

No está en ningún idioma específico, pero sería algo como esto:

function handleRequest () { while (!anythingHappened() || hasTimedOut()) { sleep(2); } return events(); }

Aquí, hasTimedOut se asegurará de que su código no espere para siempre, y anythingHappened lo que haya sucedido comprobará si ha ocurrido algún evento. El modo de sleep es para liberar tu hilo para hacer otras cosas mientras nada sucede. Los events devolverán un diccionario de eventos (o cualquier otra estructura de datos que prefiera) en formato JSON (o cualquier otro que prefiera).

Seguramente resuelve el problema, pero, si está preocupado por la escalabilidad y el rendimiento que tenía cuando investigaba, podría considerar otra solución que encontré.

Solución

¡Usa enchufes!

En el lado del cliente, para evitar cualquier problema de compatibilidad, use socket.io . Intenta usar el socket directamente, y tiene alternativas a otras soluciones cuando los sockets no están disponibles.

En el lado del servidor, cree un servidor usando NodeJS (ejemplo here ). El cliente se suscribirá a este canal (observador) creado con el servidor. Cada vez que se debe enviar una notificación, se publica en este canal y el subcriptor (cliente) recibe una notificación.

Si no te gusta esta solución, prueba APE ( Ajax Push Engine ).

Espero haberte ayudado.


Facebook usa MQTT en lugar de HTTP. Empujar es mejor que el sondeo. A través de HTTP, necesitamos sondear el servidor continuamente, pero a través del servidor MQTT se envía el mensaje a los clientes.

Comparación entre MQTT y HTTP: http://www.youtube.com/watch?v=-KNPXPmx88E

Nota: mis respuestas se adaptan mejor a los dispositivos móviles.


La forma en que Facebook hace esto es bastante interesante.

Un método común para realizar dichas notificaciones es sondear un script en el servidor (usando AJAX) en un intervalo dado (quizás cada pocos segundos), para verificar si algo ha sucedido. Sin embargo, esto puede ser bastante intensivo en la red y, a menudo, realiza solicitudes sin sentido, porque no ha ocurrido nada.

La forma en que Facebook lo hace es usar el enfoque del cometa, en lugar de sondear en un intervalo, tan pronto como una encuesta completa, se emite otra. Sin embargo, cada solicitud al script en el servidor tiene un tiempo de espera extremadamente largo, y el servidor solo responde a la solicitud una vez que algo sucede. Puede ver que esto sucede si se abre la pestaña Consola de Firebug mientras está en Facebook, y las solicitudes de un script pueden tomar minutos. Realmente es bastante ingenioso, ya que este método reduce inmediatamente tanto el número de solicitudes, como la frecuencia con la que tiene que enviarlas. Ahora, efectivamente, tiene un marco de eventos que le permite al servidor "disparar" eventos.

Detrás de esto, en términos del contenido real devuelto por esas encuestas, es una respuesta JSON, con lo que parece ser una lista de eventos e información sobre ellos. Aunque está minificado, es un poco difícil de leer.

En términos de la tecnología real, AJAX es el camino a seguir aquí, porque puede controlar los tiempos de espera de solicitud y muchas otras cosas. Recomiendo (cliché de desbordamiento de pila aquí) usar jQuery para hacer AJAX, eliminará muchos de los problemas de compatibilidad cruzada. En términos de PHP, simplemente puede sondear una tabla de base de datos de registro de eventos en su script PHP, y solo regresar al cliente cuando algo sucede. Hay, espero, muchas formas de implementar esto.

Implementar:

Lado del servidor:

Parece que hay algunas implementaciones de bibliotecas de cometas en PHP, pero para ser honesto, es realmente muy simple, quizás como el siguiente pseudocódigo:

while(!has_event_happened()) { sleep(5); } echo json_encode(get_events());

  • ¿La función has_event_happened solo verificará si algo sucedió en una tabla de eventos o algo así, y luego la función get_events devolvería una lista de las nuevas filas en la tabla? Depende del contexto del problema realmente.

  • No se olvide de cambiar el tiempo máximo de ejecución de PHP, de lo contrario, se agotará el tiempo antes de tiempo

Lado del cliente:

Echa un vistazo al complemento jQuery para hacer interacción con Comet:

Dicho esto, el complemento parece agregar un poco de complejidad, en realidad es muy simple para el cliente, quizás (con jQuery) algo como:

function doPoll() { $.get("events.php", {}, function(result) { $.each(result.events, function(event) { //iterate over the events //do something with your event }); doPoll(); //this effectively causes the poll to run again as //soon as the response comes back }, ''json''); } $(document).ready(function() { $.ajaxSetup({ timeout: 1000*60//set a global AJAX timeout of a minute }); doPoll(); // do the first poll });

Todo depende mucho de cómo se arme su arquitectura existente.


Según una presentación de diapositivas sobre el sistema de mensajería de Facebook, Facebook utiliza la tecnología del cometa para "enviar" mensajes a los navegadores web. El servidor de cometas de Facebook se basa en el servidor web de Erlang mochiweb.

En la imagen de abajo, la frase "grupos de canales" significa "servidores de cometas".

Muchos otros sitios web grandes construyen su propio servidor de cometas, porque hay diferencias entre las necesidades de cada compañía. Pero construir su propio servidor de cometas en un servidor de cometas de código abierto es un buen enfoque.

Puedes probar icomet , un servidor de cometas C ++ C1000K construido con libevent. icomet también proporciona una biblioteca de JavaScript, es fácil de usar tan simple como:

var comet = new iComet({ sign_url: ''http://'' + app_host + ''/sign?obj='' + obj, sub_url: ''http://'' + icomet_host + ''/sub'', callback: function(msg){ // on server push alert(msg.content); } });

icomet es compatible con una amplia gama de navegadores y sistemas operativos, incluidos Safari (iOS, Mac), IEs (Windows), Firefox, Chrome, etc.


Un problema importante con el sondeo largo es el manejo de errores. Hay dos tipos de errores:

  1. La solicitud puede agotar el tiempo, en cuyo caso el cliente debe restablecer la conexión inmediatamente. Este es un evento normal en una encuesta larga cuando no ha llegado ningún mensaje.

  2. Un error de red o un error de ejecución. Este es un error real que el cliente debe aceptar con gracia y esperar a que el servidor vuelva a estar en línea.

El problema principal es que si su controlador de errores restablece la conexión inmediatamente también para un error de tipo 2, los clientes utilizarán DOS en el servidor.

Ambas respuestas con código de muestra se pierden esto.

function longPoll() { var shouldDelay = false; $.ajax({ url: ''poll.php'', async: true, // by default, it''s async, but... dataType: ''json'', // or the dataType you are working with timeout: 10000, // IMPORTANT! this is a 10 seconds timeout cache: false }).done(function (data, textStatus, jqXHR) { // do something with data... }).fail(function (jqXHR, textStatus, errorThrown ) { shouldDelay = textStatus !== "timeout"; }).always(function() { // in case of network error. throttle otherwise we DOS ourselves. If it was a timeout, its normal operation. go again. var delay = shouldDelay ? 10000: 0; window.setTimeout(longPoll, delay); }); } longPoll(); //fire first handler