Facebook的做法非常有趣。
执行此类通知的一种常用方法是在给定的时间间隔(可能是每隔几秒)轮询服务器上的脚本,以检查是否发生了什么事情。然而,这可能是相当密集的网络,你经常提出毫无意义的请求,因为什么都没有发生。
The way Facebook does it is using the comet approach, rather than polling on an interval, as soon as one poll completes, it issues another one. However, each request to the script on the server has an extremely long timeout, and the server only responds to the request once something has happened. You can see this happening if you bring up Firebug's Console tab while on Facebook, with requests to a script possibly taking minutes. It is quite ingenious really, since this method cuts down immediately on both the number of requests, and how often you have to send them. You effectively now have an event framework that allows the server to 'fire' events.
在此之后,就这些投票返回的实际内容而言,它是一个JSON响应,其中包含事件列表和有关事件的信息。但是它被缩小了,所以读起来有点困难。
就实际技术而言,AJAX是解决方法,因为您可以控制请求超时和许多其他事情。我推荐(堆栈溢出陈词滥调这里)使用jQuery来做AJAX,它将采取许多交叉兼容性的问题。在PHP方面,您可以简单地轮询PHP脚本中的事件日志数据库表,并且只在发生事情时返回到客户机?我认为,有很多方法可以实现这一点。
实现:
服务器端:
PHP中似乎有一些comet库的实现,但说实话,它真的非常简单,可能就像下面的伪代码:
while(!has_event_happened()) {
sleep(5);
}
echo json_encode(get_events());
has_event_happens函数只检查事件表中是否发生了任何事情,然后get_events函数将返回表中的新行列表?这取决于问题的背景。
不要忘记更改PHP的最大执行时间,否则会提前超时!
客户端:
看看jQuery插件做Comet交互:
项目主页:http://plugins.jquery.com/project/Comet
谷歌代码:https://code.google.com/archive/p/jquerycomet/ -在subversion存储库中似乎有某种示例用法。
也就是说,这个插件似乎增加了一些复杂性,它在客户端上真的很简单,也许(使用jQuery)是这样的:
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
});
整个事情在很大程度上取决于现有架构如何组合在一起。