Php 使用sleep()进行长轮询JQUERY聊天

Php 使用sleep()进行长轮询JQUERY聊天,php,jquery,sql,ajax,long-polling,Php,Jquery,Sql,Ajax,Long Polling,下面的代码使网页加载大约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

下面的代码使网页加载大约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();
    }
}

有什么建议吗?

您是在递归调用函数,由于会话变量在函数调用之间没有变化,如果它第一次转到
else
部分,它每次都会转到那里,从而创建一个永无止境的循环


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

您是在递归地调用您的函数,并且由于会话变量在函数调用之间没有变化,如果它第一次转到
else
部分,它每次都会去那里,创造一个永无止境的循环


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

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

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


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

函数将永远不会返回,直到第一次选择得到一些结果

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


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

在执行任何长轮询技术时,您都需要了解一些事情

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

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


  • 在执行任何长轮询技术时,都有一些事情需要注意

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

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


  • 我怀疑响应永远不会结束,或者更确切地说,永远不会(几分钟内)开始发送。@pst直到遇到堆栈溢出:p
    config.php
    看起来像什么?您可能需要它来确保获得sql连接。我怀疑响应永远不会结束,或者更确切地说,永远不会(几分钟内)开始发送。@pst直到遇到堆栈溢出:p
    config.php
    看起来像什么?您可能需要它来确保获得sql连接。第二个参数在“config.php”@user2124281中,我也这么认为,并删除了该部分。。。在你的问题下面看到我的评论。我确实在JS端设置了超时,但我想保留请求直到有新的信息。第二个参数在“config.php”@user2124281中,我也做了同样的计算并删除了该部分。。。在你的问题下面看到我的评论。我确实在JS端设置了超时,但我想保留请求直到有新的信息。