PHP:Longpolling&彗星相关

时间:2012-02-12 11:25:36

标签: php javascript jquery ajax comet

最近,我要为我的网站制作一个即时通知系统。在这种情况下,我听说COMET是必不可少的。

我一直在搜索PHP&彗星已经有一段时间了,但是,指南&我发现的文章似乎只是循环中的ajax请求。例如,有一个基本的javascript代码,每隔2秒从PHP文件中获取值并输出到HTML。据我所知,应该是COMET将新值推送到HTML,因此,循环应该在服务器端,而不是客户端。我母语中的一半文章使用setInterval()并每隔X秒联系PHP文件。

所以,我有一些问题要问你。

  1. 是否有任何指南或示例,它们不使用任何易于理解的XAJAX / NOLOH外部框架?
  2. 在服务器端使用COMET或每隔X秒从ajax.php请求值之间有什么性能差异?
  3. 我上面提到的定时请求可以称为COMET? (例如Long Polling using jQuery and PHP
  4. 我是否需要任何扩展才能运行COMET服务器端? (我的webhost使用Apache,我个人使用Nginx)

2 个答案:

答案 0 :(得分:3)

您必须使用客户端脚本(AJAX),因为必须轮询服务器。如果没有打开连接,服务器不能简单地将消息发送到某人的浏览器。 我对HTML5 websockets并不太熟悉,但我相信这可以让你与服务器建立持久的联系,但是HTML5浏览器并没有被广泛用作“公共”网站上的解决方案。

轮询工作多长时间是从浏览器发送异步请求的时间很长(例如30秒),当请求到达服务器时,它会检查新消息,但是当有现在要显示的消息,而不是直接输出结果,它进入无限循环,轮询数据库,例如每秒(使用sleep推迟查询),直到找到消息。找到消息后,它会终止循环并输出结果。如果30秒后没有消息,则脚本超时并发回一个空请求。

因此请求可以在0到30秒之间发回。一旦请求到达浏览器,它就会被处理,并发送一个新的30秒请求。

关于你的问题;

  1. 您需要一个客户端框架来进行轮询
  2. 您不能仅在服务器端使用Comet。使用longpolling优于正常轮询(例如每秒轮询)非常重要,因为您的服务器请求少得多
  3. 据我所知;是
  4. 您可以使用任何服务器端语言,只要它可以在查询邮件时保持连接打开。
  5. 另请查看http://nodejs.org/

答案 1 :(得分:1)

我不知道究竟什么是COMMET。但为了这个目的,你有很多解决方案。 一,正如你所提到的那样是ajax的长期投票。很简单。而不是只记录新的浏览器(HtML5)。

另一个选项是“server-sent -event”。它需要带有HTML5的浏览器,但它保持连接不活动而不进行轮询:

客户端:

if (window.EventSource) {
    window.onload = function() {
        window.scrollTo(0,1);
        setTimeout(
        function() {

            var source = new EventSource("events.php");
            source.onmessage = function (event) {
              document.body.innerHTML += event.data + "<br>";
            };
        }, 1000);
    };
} else {
    document.write("Please visit this page in a browser that supports EventSource to see the test");
} 

服务器:

if ($_SERVER['HTTP_ACCEPT'] === 'text/event-stream') {
    header('Content-Type: text/event-stream');
    echo "data: This is the first event\n\n";
    flush();
    $i = 5;
    while (--$i) {
        sleep(1);
        $time = date('r');
        echo "data: The server time is: {$time}\n\n";
        flush();
    }
} else {
    echo 'This demo is for use with an EventSource compatible browser.';
}

好运。