PHP:长轮询&彗星相关

PHP: Longpolling & Comet related

本文关键字:amp PHP      更新时间:2023-09-26

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

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

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

  1. 是否有任何指南或示例,不使用任何易于理解的外部框架,如XAJAX/NOLOH
  2. 在服务器端使用COMET和每X秒从ajax.php请求一次值之间的性能差异是什么
  3. 我上面提到的定时请求可以称为COMET?(例如,使用jQuery和PHP进行长轮询)
  4. 运行COMET服务器端需要任何扩展吗?(我的网络主机使用Apache,我个人使用Nginx)

您必须使用客户端脚本(AJAX),因为必须轮询服务器。在没有打开连接的情况下,服务器不能简单地将消息发送到某人的浏览器。我对HTML5网络套接字不太熟悉,但我相信这可以让你与服务器保持持久的连接,然而HTML5浏览器并没有被广泛使用,无法将其作为"公共"网站上的解决方案。

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

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

至于你的问题;

  1. 您需要一个客户端框架来进行轮询
  2. 不能仅在服务器端使用Comet。与正常轮询相比,使用长轮询(例如每秒轮询一次)非常重要,因为您发出的服务器请求要少得多
  3. 据我所知;是
  4. 您可以使用任何服务器端语言,只要它可以在查询消息时保持连接打开即可

还可以看看http://nodejs.org/

我不知道COMMET到底是什么意思。但为了这个目的,你有很多解决方案。正如您提到的,一个是ajax的长轮询。很简单。而不是仅重新请求新浏览器(HtML5)。

还有一个选项是"服务器发送事件"。它需要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.';
}

祝你好运。