【问题标题】:Long polling JQUERY chat using sleep()使用 sleep() 长轮询 JQUERY 聊天
【发布时间】:2013-03-01 20:41:09
【问题描述】:

以下代码使网页加载大约 10 分钟,我不知道为什么!

function chatheartbeat(){
    include("config.php");
    $useradn = $_SESSION['displayname'];
    $query = "select * from chat where (userbdn = '".$useradn."' AND isread = 1) order by id ASC";
    $result = mysql_query($query , $link);
    $num_rows = mysql_num_rows($result);
    if ($num_rows >= 1) {
        $items = array();
        $i='1';
        while($chat = mysql_fetch_array($result)){
            $items[$i]['from']=$chat['useradn'];
            $items[$i]['msg']=$chat['msg'];
            $items[$i]['timee']=date("H:i" ,$chat['timee']);
            $i++;
        }
        $query = "update chat set isread = 0 where userbdn = '".$useradn."' and isread = 1";
        mysql_query($query , $link);
        header('Content-type: application/json');
        echo json_encode($items);
        exit;
    }else{
        sleep(2);
        chatheartbeat();
    }
}

有什么建议吗?

【问题讨论】:

  • 我怀疑响应永远不会结束,或者更确切地说,永远不会(几分钟)开始发送。
  • @pst 直到遇到堆栈溢出:P
  • config.php 是什么样的?您可能应该要求它来确保您获得 sql 连接。

标签: php jquery sql ajax long-polling


【解决方案1】:

在第一次选择得到一些结果之前,该函数永远不会返回。

我建议您在 n 次运行后返回(例如 5 次),即使没有结果也是如此。然后客户端可以重新发出 ajax 调用以再次轮询。

此外,以递归方式执行此操作也不是一个好主意。我建议改为在 for 循环中执行此操作。

【讨论】:

    【解决方案2】:

    您正在递归调用您的函数,并且由于会话变量在函数调用之间没有改变,如果它第一次进入else 部分,它每次都会去那里,创建一个永无止境的循环。

    顺便说一句,如果你想使用轮询,你应该在客户端(javascript)中设置一个计时器,而不是在服务器端使用递归函数。

    【讨论】:

    • 第二个参数在“config.php”中
    • @user2124281 我想了很多并删除了那部分...请参阅我在您问题下方的评论。
    • 我在 JS 端做了 settimeout,但我想保留请求直到有新信息。
    【解决方案3】:

    在执行任何长轮询技术时,您需要注意一些事项。

    1. 您需要在某个预定义的时间段后退出。在服务器上等待直到您有响应的内容会导致执行超时。

    2. 了解您的 SESSION 数据的情况。默认情况下,PHP 将使用基于文件的会话并在请求过程中锁定文件(除非您干预)

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 2013-03-28
      • 2012-10-22
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      相关资源
      最近更新 更多