普通 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 套接字、长轮询、服务器发送事件和永久帧之间有啥区别?