Ajax 长轮询

3
我最近在StackOverflow上询问了一个有关我的函数的问题,人们建议我使用Ajax长轮询。我花了过去几天的时间研究这个主题,并尝试编写基本的长轮询代码,但是没有任何一个代码能够工作,我无法让任何事情都起作用。
以下是我的基本函数:
    <script language='javascript' type='text/javascript'>
    var interval=self.setInterval("checkformessages()",4000)
    function checkformessages() {
    $('#incomingmessages<?php echo $otherchatuser ?>').load('checkfornewmessages.php?username=<?php echo $username; ?>&otherchatuser=<?php echo $otherchatuser; ?>');
    }
    </script>

请问有人能告诉我如何将这个函数变成基本的长轮询函数,甚至只是指引我到达那里的路径。非常感谢任何帮助。谢谢!

1个回答

6
通常情况下(即在不使用长轮询的情况下),您的JavaScript代码会向服务器发出请求,服务器会立即返回信息。但是,您的服务器可能并不总是立刻有重要事情要说。在您的示例中(似乎是聊天),当您对checkfornewmessages.php进行请求时,您正在与之聊天的人可能没有说任何话。因此,当您的JavaScript客户端询问服务器有什么话要说时,服务器确实没有除“没有说任何话”以外的回应。
与长轮询相比,您不必让checkfornewmessages.php立即返回“没有说任何话”,而是直到有重要内容要返回才从中返回。
换句话说,为了使长轮询起作用,在服务器端完成有趣的工作,通常在您的checkfornewmessages.php页面上。您的JavaScript代码除了联系checkfornewmessages.php并等待其响应外,无需执行任何操作。

所以我需要编写一个不同的函数来调用chekfornewmessages.php。然后,就像我的上面的函数一样,我可以将任何新更改加载到div中。 - Eggo
2
@Eggo 基本上,你对 load 的调用会联系到 checkfornewmessages.php,然后停止并等待 checkfornewmessages.php 返回新消息。checkfornewmessages.php 不会返回,直到有人说了什么。这可能需要很长时间,因此术语为长轮询。当有人说话时,服务器立即返回。 - Jack Edmonds
我认为我理解长轮询的基本概念,但如何编写一个长轮询函数呢?我尝试过的一切似乎都不起作用? - Eggo
@Eggo 一种实现方法是创建一个 ChatRoom 类并将其放置在所有成员的会话中。 ChatRoom 将具有某种阻塞队列。 checkfornewmessages.php 将尝试从队列中拉取消息,这将阻止请求返回,直到有可用的消息。 然后另一个页面 sendmessage.php 或其他什么东西将在队列上放置一些内容,这将立即解除所有 checkfornewmessages.php 请求的阻塞。 - Jack Edmonds
@Eggo 我不知道有没有 PHP 的阻塞队列实现,快速搜索也没有找到。但你可以考虑使用 Apache ActiveMQ 这样的东西(尽管这似乎有些过度)。 - Jack Edmonds
这看起来有点过度了。我对这个长轮询的东西现在比以往任何时候都更加困惑,因为没有人在线上提供一个简单的函数,它们都过于复杂,即使是详细写出来,对我来说也不合理。我可能还是坚持使用我的原始函数,因为我没有快速取得任何进展。 - Eggo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接