无法实现长轮询

时间:2012-03-15 13:46:28

标签: long-polling

if(isset($_GET['actionid']) && isset($_GET['profileid']))
{
        $actionid = $_GET['actionid'];
        $profileid = $_GET['profileid'];
        $res = $database->news_poll($profileid,$actionid);
        $k = 0;
        while(!$NROW =$res->fetch_array())
        {
            usleep('50000000');
            $res = $database->news_poll($profileid,$actionid);
        }
        $action = actiontype_encode($NROW,'0',$json,$encode,$database);
        $data['action'] = $action;
        echo json_encode($data);
}

这是我用于轮询服务器以获取新数据的脚本。 但是工作浏览器仅停止为我的网站工作。我想问题是,当特定浏览器订阅新数据时,连接保持打开,因此浏览器不能再向同一服务器发出请求。请解释是否有任何问题。

2 个答案:

答案 0 :(得分:1)

如果有任何方法可以,我建议您使用NodeJSSocketIO进行长时间轮询。您的Web服务器需要为每个连接的用户保持打开请求,这比Apache / PHP可以处理的时间更长。

如果那是不可能的,我推荐短轮询,每隔3秒做一次正常的ajax请求。这不是完美而是可管理的。

我最近用more details回答了类似的问题。

无论语言如何,我都强烈反对编写自己的长轮询服务器,除非您希望将其作为您的项目几年。我参与过一个项目,该项目使用了一个编写C的本地长轮询服务器,然后用Java重写,但它并不漂亮。

答案 1 :(得分:0)

我发现问题在于Apache一次只能为一个客户端提供多个请求。因此,当请求对后端的长轮询脚本请求新数据时,请求会将来自同一浏览器的其他请求挂起到同一服务器。

要克服这个缺点,需要使用node.js或tornado。