实时显示在线的其他用户?

时间:2011-12-21 03:28:26

标签: php jquery ajax facebook real-time

facebook如何处理他们的“实时”数据?如果您正在查看自己的活动Feed并且用户喜欢某些内容,您可以立即看到文字更改,说明该用户喜欢它,或者当您收到通知后,您会在页面上看到红色通知标记,而无需刷新。

我知道这段代码无需刷新即可推送数据:

$.post('ajax/test.html', function(data) {
  $('.result').html(data);
});

但有人可以解释如何推送实时数据,以便其他用户能够在他们的页面上看到更新而无需刷新。

由于

3 个答案:

答案 0 :(得分:6)

这可以使用各种技术来实现,这些技术有很多名称:长轮询,服务器发送事件,Comet,WebSockets等。

基本理念是:

  • Alice打开脸书。她的浏览器发出更新请求(例如$.get),但如果没有新的更新且请求仍处于“等待”状态,则服务器不响应。

  • Bob打开脸书。他决定评论爱丽丝的墙。他的浏览器将他的评论发布到服务器($.post)。

    • 服务器接受此帖子,正确处理(保存到Alice的墙上等)
    • 但ALSO服务器会检查Alice是否有等待更新请求。如果有,服务器将有关此更新的信息呈现到响应流中并关闭连接。
  • Alice的浏览器终于​​得到了对这个长挂请求的响应,并在通知区域中愉快地绘制了一个红色的“1”。它还会立即打开另一个更新请求(不要错过任何一个)。

  • Alice看到Bob的评论,该评论已立即发布。

所描述的技术称为“长轮询”,谷歌首次在Gmail中引入该技术。

答案 1 :(得分:2)

此问题有多种解决方案,您必须进行一些研究以确定要实施的内容。其中一些解决方案统称为Comet(http://en.wikipedia.org/wiki/Comet_%28programming%29

Facebook使用的方法是Ajax Long Polling。在此方法中,对服务器进行ajax调用,服务器等待响应,使连接保持挂起状态,直到达到更新或达到最大时间。如果在该间隔期间收到新数据,例如聊天消息,则它立即响应数据。在每次调用结束时,客户端然后启动一个新的ajax调用并等待。如果您在Facebook上观看浏览器控制台,则可以看到这些电话。

下一个方法称为永久帧,其中使用隐藏的iFrame并连续发送chunked日期并且永远不会完成加载。收到后,主框架会读取此数据。

另一种可用的解决方案是WebSockets。 WebSockets是一个真正的双向浏览器持久连接,功能非常强大。然而,它处于早期阶段,直到最近的修订被某些浏览器阻止了安全问题。

答案 2 :(得分:0)

  1. 创建PHP脚本,提取所有相关更新并以JSON格式输出。
  2. 设置javascript以按时间间隔请求PHP脚本并更新相应的元素。