Ajax 长轮询

Posted

技术标签:

【中文标题】Ajax 长轮询【英文标题】:Ajax Long Polling 【发布时间】:2012-02-24 14:03:27 【问题描述】:

我最近在 *** 上问了一个关于我的功能的问题,人们建议我使用 。在过去的几天里,我一直在研究这个主题并尝试编写基本的长轮询代码,但都没有奏效,而且我根本无法完成任何工作。

这是我的基本功能:

    <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】:

通常(即不使用长轮询时),您的 JavaScript 代码会向您的服务器发出请求,您的服务器会立即返回信息。但是,您的服务器可能并不总是有重要的事情要立即说出来。在您的示例中(似乎是聊天),当您向checkfornewmessages.php 发出请求时,与您聊天的人可能没有说任何话。因此,当您的 JavaScript 客户端询问服务器所说的内容时,服务器实际上没有任何响应,除了“Nothing has been said”。

使用长轮询而不是让checkfornewmessages.php 立即返回“Nothing has been said”,你根本不会从 checkfornewmessages.php 返回,直到有重要的事情要返回。

换句话说,要使长轮询工作,有趣的事情是在服务器端完成的,可能在您的checkfornewmessages.php 页面中。您的 JavaScript 代码无需执行任何操作,只需联系 checkfornewmessages.php 并等待其响应。

【讨论】:

所以我必须编写一个不同的函数来调用 chekfornewmessages.php。然后,就像我上面的函数一样,我可以将任何新的更改加载到 div 中。 @Eggo 基本上,您对load 的呼叫将联系checkfornewmessages.php,然后停止并等待checkfornewmessages.php 返回新消息。 checkfornewmessages.php 在有人说了什么之前不会回来。这可能需要很长时间,因此称为 long 轮询。当有人说什么时,服务器立即返回。 所以我认为我了解了长轮询的基本概念,但是如何编写长轮询函数呢?我尝试过的任何方法似乎都不起作用? @Eggo 一种方法是创建一个ChatRoom 类并将其放入所有成员的会话中。 ChatRoom 会有某种阻塞队列。 checkfornewmessages.php 会尝试从队列中拉出一条消息,这将阻止请求返回,直到有可用的消息。然后另一个页面sendmessage.php 或其他东西会在队列中放置一些东西,这会立即解除对所有checkfornewmessages.php 请求的阻止。 @Eggo 我不知道 PHP 的任何阻塞队列实现,快速搜索也没有发现任何问题。但是你可能会考虑像 Apache ActiveMQ 之类的东西(虽然这看起来有点矫枉过正)

以上是关于Ajax 长轮询的主要内容,如果未能解决你的问题,请参考以下文章

python之轮询长轮询websocket

轮询长轮询长连接的区别

短连接长连接和短轮询长轮询

轮询长轮询和websocket

轮询长轮询和websocket

轮询长轮询comet长连接SSEwebsocket