La forma en que Facebook hace esto es bastante interesante.
Un método común para hacer tales notificaciones es sondear un script en el servidor (usando AJAX) en un intervalo dado (tal vez cada pocos segundos), para verificar si algo ha sucedido. Sin embargo, esto puede ser bastante intensivo en la red, y a menudo haces solicitudes sin sentido, porque no ha pasado nada.
La forma en que Facebook lo hace es usar el enfoque del cometa, en lugar de sondear en un intervalo, tan pronto como se completa una encuesta, 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 ha sucedido. Puede ver que esto sucede si abre la pestaña Consola de Firebug mientras está en Facebook, y las solicitudes de un script posiblemente demoren 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. Efectivamente, ahora tiene un marco de eventos que 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. Sin embargo, está minimizado, por lo que 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 solicitudes y muchas otras cosas. Recomiendo (haga clic aquí en el cliché de desbordamiento) usar jQuery para hacer el AJAX, eliminará muchos de los problemas de compatibilidad cruzada. En términos de PHP, ¿podría simplemente sondear una tabla de base de datos de registro de eventos en su script PHP y solo regresar al cliente cuando sucede algo? 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 sincero, realmente es muy simple, algo así como el siguiente pseudocódigo:
while(!has_event_happened()) {
sleep(5);
}
echo json_encode(get_events());
La función has_event_happened solo verificaría 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 olvides cambiar el tiempo máximo de ejecución de PHP, de lo contrario, se agotará pronto!
Lado del cliente:
Eche un vistazo al complemento jQuery para realizar la interacción Comet:
Dicho esto, el complemento parece agregar un poco de complejidad, realmente es muy simple para el cliente, tal vez (con jQuery) algo así 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 arma su arquitectura existente.