【问题标题】:Long polling timeout issue长轮询超时问题
【发布时间】:2011-02-11 03:57:21
【问题描述】:

我正在做一个长轮询方法聊天室。但似乎,当发生长轮询并且我在 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();
      }
    }

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

【问题讨论】:

  • 尝试在服务器端代码中的echo 之后放置一个break;
  • 感谢四位您的回答 :) 我实际上有,但忘记包含在我的问题代码中。所以这不是问题。
  • 伙计们,我从这个问题中弄清楚了:stackoverflow.com/questions/4457178/… - php 锁定一个给定的会话,直到页面完成加载,所以第二个 ajax 调用无法通过。你必须通过调用 session_write_close() 来释放锁;
  • 您知道您以message 发回消息,但在您的JavaScript 中使用messages 访问它?
  • alex - 是的,对不起。我只是快速重写了代码,因为我不想粘贴所有内容(您可能不想阅读所有内容)。 =)

标签: php javascript ajax comet


【解决方案1】:

我可以看到您已经回答了您自己的问题,但是我最近遇到了类似的问题,并找到了另一种处理方法是在 ajax 调用上禁用 setTimeout,然后在 success 上重新启动它。这样一来,您就不会在服务器尚未准备好提供信息时对服务器进行 ping 操作。

【讨论】:

  • AFAIK,setTimeout 只调用该函数一次。所以你仍然需要在请求成功后重新开始通话。你能详细说明一下你的答案吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-12-11
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多