gpt4 book ai didi

comet - facebook、gmail如何发送实时通知?

转载 作者:行者123 更新时间:2023-12-03 04:04:50 26 4
gpt4 key购买 nike

我读过一些关于这个主题的帖子,答案是 comet、反向 ajax、http 流、服务器推送等。

How does incoming mail notification on Gmail works?

How is GMail Chat able to make AJAX requests without client interaction?

我想知道是否有任何代码引用可以让我编写一个非常简单的示例。许多帖子或网站只是谈论该技术。很难找到完整的示例代码。另外,似乎可以使用很多方法来实现 cometd ,例如隐藏的 IFrame、XMLHttpRequest。在我看来,使用 XMLHttpRequest 是更好的选择。您认为不同方法的优缺点如何? Gmail 使用哪一种?

我知道它需要在服务器端和客户端都执行此操作。有 PHP 和 Javascript 示例代码吗?

最佳答案

Facebook 的做法非常有趣。

执行此类通知的常见方法是在给定的时间间隔(可能每隔几秒)轮询服务器上的脚本(使用 AJAX),以检查是否发生了某些情况。但是,这可能会占用大量网络资源,并且您经常会发出毫无意义的请求,因为什么也没有发生。

Facebook 的做法是使用 cometd 方法,而不是按一定时间间隔进行轮询,一旦一个轮询完成,它就会发布另一个轮询。但是,对服务器上脚本的每个请求都有极长的超时时间,并且服务器只有在发生某些情况时才会响应请求。如果您在 Facebook 上打开 Firebug 的“控制台”选项卡,您就会看到这种情况的发生,其中对脚本的请求可能需要几分钟的时间。这确实非常巧妙,因为这种方法立即减少了请求的数量以及发送请求的频率。您现在实际上拥有了一个允许服务器“触发”事件的事件框架。

在这背后,就这些民意调查返回的实际内容而言,它是一个 JSON 响应,其中似乎是事件列表以及有关事件的信息。虽然它被缩小了,所以有点难以阅读。

就实际技术而言,AJAX 是最佳选择,因为您可以控制请求超时以及许多其他事情。我建议(这里是堆栈溢出陈词滥调)使用 jQuery 来执行 AJAX,它将消除很多交叉兼容性问题。就 PHP 而言,您可以简单地在 PHP 脚本中轮询事件日志数据库表,并且仅在发生某些情况时才返回客户端?我预计有很多方法可以实现这一点。

实现:

服务器端:

PHP 中似乎有一些 Comet 库的实现,但说实话,它确实非常简单,可能类似于以下伪代码:

while(!has_event_happened()) {
sleep(5);
}

echo json_encode(get_events());
  • has_event_happened 函数只会检查事件表中是否发生了任何事情,然后 get_events 函数将返回表中新行的列表?具体取决于问题的背景。

  • 不要忘记更改 PHP 最大执行时间,否则它会提前超时!

客户端:

看一下用于进行 Comet 交互的 jQuery 插件:

也就是说,该插件似乎增加了相当多的复杂性,它在客户端上确实非常简单,也许(使用 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
});

整个事情在很大程度上取决于您现有架构的组合方式。

关于comet - facebook、gmail如何发送实时通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1086380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com