长轮询超时问题

时间:2011-02-11 03:57:21

标签: php javascript ajax comet

我正在做一个长轮询方法聊天室。但似乎,当一个长的民意调查发生并且我刷新了Chrome页面或我尝试发送另一个异步请求时,一切都超时(即我无法再次加载我的域,直到我关闭/重新打开浏览器)。

我的客户端端代码是:

 $(document).ready(function() {
    setTimeout(
      function () {
        longPollForMessages();
      },
      500
    );
  });

function longPollForMessages()
{
  $.ajax({
    url: url,
    dataType: 'json',
    success: function(data) {     
        $('#chat_messages').append('<div>'+data.messages+'</div>');

        longPollForMessages();
    }
  });
}

我的服务器端:

while(true) {
      $messages = $db->getMessages();

      if (!$messages || sizeof($messages)==0) {
        sleep(1);
      } else {
        echo '{"message":'.json_encode($messages).'}';
        die();
      }
    }

有什么想法吗?假设没有语法错误。

2 个答案:

答案 0 :(得分:0)

我可以看到你已经回答了自己的问题,但我最近遇到了类似的问题,并发现另一种方法是在ajax调用上禁用setTimeout,然后在success重新启动它。这样,当您还没有准备好提供信息时,您不会ping服务器以获取信息。

答案 1 :(得分:0)

我从这个问题中找到了它:stackoverflow.com/questions/4457178 / ... - php锁定给定的会话,直到页面完成加载,因此第二个ajax调用无法通过。您必须通过调用session_write_close()来释放锁定;