普通 ajax 和长轮询之间的区别

Posted

技术标签:

【中文标题】普通 ajax 和长轮询之间的区别【英文标题】:Difference between a normal ajax and long polling 【发布时间】:2015-07-26 23:06:50 【问题描述】:

我正在尝试了解更多关于实时“操纵”网站的长轮询,看过一些视频,我目前正在考虑:

假设我有一个旧日期,我和 sql 对此进行了回显。只要轮询就会知道旧日期会不会和根据setInterval函数时不时看起来的不一样...?

假设我想显示一个博客的发布,其中所有文本都在 mysql 中,但是我发布了一个新的发布,当时页面上有谁,你会看到发布时间(不告诉我?) , 那么一个长轮询代码如何知道新旧出版物之间的区别呢?吃了甚至不给冲突或重复刻在sql上的相同日期。

【问题讨论】:

进行这些计算不应该是长轮询 javascript 方法的工作。老实说,您的服务器端代码应该确定这些事情。 javascript 应该只对返回的数据进行条件语句。尽量不要把业务逻辑放在客户端。 看看谷歌搜索:使用长轮询的简单聊天 【参考方案1】:

由于您最初的问题是这两种技术之间的区别是什么,所以我将从以下开始:

AJAX 轮询

使用 AJAX 轮询更新页面意味着您以定义的时间间隔向服务器发送请求,如下所示:

客户端向服务器发送请求,服务器立即响应。

一个简单的例子(使用 jQuery)如下所示:

setInterval(function()
    $('#myCurrentMoney').load('getCurrentMoney.php');
, 30000);

这样做的问题是,这将导致很多无用的请求,因为每个请求不会总是有新的东西。

AJAX 长轮询

使用 AJAX 长轮询意味着客户端向服务器发送请求,服务器在响应之前等待新数据可用。这看起来像这样:

客户端发送请求,服务器“不定期”响应。一旦服务器响应,客户端就会向服务器发送一个新的请求。

客户端如下所示:

refresh = function() 
    $('#myCurrentMoney').load('getCurrentMoney.php',function()
        refresh();
    );


$(function()
    refresh();
);

这只是将getCurrentMoney.php 的输出加载到当前的money 元素中,一旦有回调,就开始一个新的请求。

在服务器端,您通常使用循环。为了解决您的问题,服务器将如何知道哪些是新发布:要么将最新的时间戳传递给客户端可用发布到服务器,要么使用“长轮询开始”的时间作为指标:

<?
$time = time();

while ($newestPost <= $time) 
    // note that this will not count as execution time on linux and you won't run into the 30 seconds timeout - if you wan't to be save you can use a for loop instead of the while
    sleep(10000);
    // getLatestPostTimestamp() should do a SELECT in your DB and get the timestamp of the latest post
    $newestPost = getLatestPostTimestamp();


// output whatever you wan't to give back to the client
echo "There are new posts available";

在这里我们不会有“无用”的请求。

【讨论】:

哦,好回答,我的朋友,我什么都能理解,但是如果我想用新的日期追加到正文中,建议呢? 所以您想将新博文附加到正文中?好吧,我会推荐一些类似于 *** 的东西(如果你不知道那是什么:去一个标签 - 例如 PHP 并等待大约 1 分钟。会有一个框说,有 'x'新问题)。所以不要附加它,因为如果你这样做,读者可能会因为你移动了整个内容而被打断。带有可以单击的消息的框更简单。当您单击它时,将附加新帖子:-) 明白了,最不明白我将如何建立参数不重复mysql中记录的旧日期,我似乎永远不会明白,但这是我最需要的:/ sleep() 以秒为单位,而不是毫秒。所以应该是 sleep(10) :) 这可以在多实例应用程序中使用吗?横向扩展后客户端还会向同一台服务器发送新请求吗?

以上是关于普通 ajax 和长轮询之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

轮询和长轮询

轮询和长轮询优缺点分析

Web 套接字、长轮询、服务器发送事件和永久帧之间有啥区别?

Tornado-长轮询_webSocket

服务器推Comet长轮询的方式与普通AJAX不断请求的方式的区别

哪些特定用例需要 BOSH over WebSockets 和长轮询? [关闭]