【问题标题】:Cannot implement long polling无法实现长轮询
【发布时间】:2012-04-01 00:51:48
【问题描述】:
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);
}

这是我用于轮询服务器以获取新数据的脚本。 但工作浏览器仅对我的网站停止工作。我想问题在于,当特定浏览器订阅新数据时,连接保持打开状态,因此浏览器无法向同一服务器发出进一步的请求。如有问题请说明。

【问题讨论】:

    标签: long-polling


    【解决方案1】:

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

    如果这不可能,我建议短轮询,每 3 秒执行一次正常的 ajax 请求。这并不完美,但可以管理。

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

    无论使用哪种语言,我都强烈建议您不要编写自己的长轮询服务器,除非您希望它成为您的项目几年。我参加过一个项目,该项目使用了一个用 C 编写的自制长轮询服务器,然后用 Java 重新编写,结果并不漂亮。

    【讨论】:

    • 我需要实现长轮询。这非常重要,并且确实需要使用长轮询而不是短轮询来实现它。请帮忙。请指出实现的实际问题。
    【解决方案2】:

    我发现问题在于 Apache 一次处理来自单个客户端的多个请求。因此,当向后端的长轮询脚本发出请求以获取新数据时,该请求会将来自同一浏览器的其他请求挂起到同一服务器。

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

    【讨论】:

      猜你喜欢
      • 2013-02-17
      • 2022-01-14
      • 1970-01-01
      • 2011-09-16
      • 2017-09-12
      • 2012-06-02
      • 2012-10-06
      • 2010-09-24
      • 2011-12-26
      相关资源
      最近更新 更多