php简单的“长轮询”的实例代码

身居漏室,心系天下

    我们可以在网上找到信息是如何长轮询的实例,但都比较复杂。这里提供一个简单的例子.前端用jquery,后台处理用php。


    注:Apache是​​不适合担任长轮询请求,这会很快耗尽服务器上的线程(因此提的例子并不需要扩展),只是一个通用的,简单的,用于了解具体的实现过程。
这里是一个非常简单的例子,在2-10秒后发送一个简单的字符串。 有三分之一的机会返回错误404(错误返回给JavaScript示例显示并处理),其中将“长轮询”服务器的返回信息.

    msgsrv.php

<?php
if(rand(1,3) == 1){
    /* Fake an error */
    header("HTTP/1.0 404 Not Found");
    die();
}

/* Send a string after a random number of seconds (2-10) */
sleep(rand(2,10));
echo("Hi! Have a random number: " . rand(1,10));
?>
    注意:对于一个真正的网站,一个普通的web服务器,比如Apache上运行,这将很快扳消耗所有的“工作线程”,让它无法响应其他请求。要解决这个问题,建议用python,它是不依赖于每个单一线程请求的“长轮询服务器”。 cometD是流行的一种(在几种语言中),以至Tornado专门为这样的任务做了一个新的框架(专为FriendFeed上的长轮询代码)......但作为一个简单的例子,A​​pache是​​绰绰有余!该脚本可以很容易地用任何语言编写(我选择的是Apache / PHP,因为他们是很常见的,碰巧我在本地能运行它们)

    在Javascript中,您请求的上述文件(msg_srv.php),并等待响应。当你得到一个响应,对返回的数据进行处理,然后再请求,触发新的等待,如此重复这个过程.

下面是这样一个页面的一个例子。当页面加载时,它发送msgsrv.php文件的初始请求。如果成功,我们将消息附加到div上,然后在1秒钟后,我们再次调用该waitForMsg函数,这将触发等待。


如果返回错误(无法打到页面),它附加到显示错误信息的div上,等待15秒,然后重试(等同于我们等待1秒接收到的信息的处理).


    long_poller.htm

京ICP备14008139号-1