普通的AJAX和长轮询的区别。

10

我正在尝试更多地了解长轮询以实时“操作”网站,看了一些视频,到目前为止我的想法是:

假设我有一个旧日期,它在sql上并且我在上面进行回显。只要长轮询知道旧日期将不同于根据setInterval函数的时间推移而出现的新日期,那么它就会知道......?

比如说我想展示博客中的所有文本都在mysql中,但我突然发布一篇新文章,那么在当前页面上的用户将会看到新文章的发表时间(难道不是吗?),那么长轮询代码怎么知道旧文章和新文章之间的区别呢?即使不给出冲突或在sql中刻录相同的日期。


长轮询 JavaScript 方法不应该负责进行这些计算。说实话,你的服务器端代码应该决定这些事情。JavaScript 只应该针对返回的数据进行条件语句判断。如果可以的话,请尽量不要将业务逻辑放在客户端。 - Ohgodwhy
请搜索谷歌:使用长轮询实现简单聊天 - Kevin mtk
1个回答

21

既然您最初的问题是这两种技术之间的区别,我将从这个方面开始:

AJAX轮询

使用AJAX轮询更新页面意味着您需要在定义的时间间隔内向服务器发送一个请求,它看起来像这样:

AJAX轮询

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

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

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

这样做的问题是,由于并不总会有新内容,这将导致许多无用的请求。 AJAX长轮询 使用AJAX长轮询意味着客户端发送请求到服务器,然后服务器在有新数据可用之前等待响应。 这将如下所示:
客户端发送请求,服务器“不规则”地响应。 一旦服务器响应,客户端将向服务器发送新请求。
客户端代码将如下所示:
refresh = function() {
    $('#myCurrentMoney').load('getCurrentMoney.php',function(){
        refresh();
    });
}

$(function(){
    refresh();
});

这将会把 getCurrentMoney.php 的输出加载到当前金额元素中,并在有回调时立即开始新的请求。
在服务器端,通常使用循环。为了解决您的问题,服务器如何知道哪些是新发布的内容:您可以将最新发布的时间戳传递给客户端可用的出版物,也可以使用“长轮询开始”的时间作为指示器:
<?
$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";

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


哦,好的回答,我的朋友,我能理解一切,但是如果我想在正文中添加新日期,这样做是否可行? - Kevin mtk
所以你想将新博客文章附加到正文中?嗯,我建议采用类似stackoverflow的做法(如果你不知道是什么:去一个标签 - 例如PHP并等待约1分钟。会有一个框,上面写着有“x”个新问题)。所以不要附加它,因为如果这样做,读者可能会被打断,因为你移动了整个内容。一个带有消息的框更简单。当你点击它时,新的文章将被附加 :-) - Marc
明白了,大多数人不理解我如何建立参数以避免在mysql中重复记录旧日期,似乎我永远也无法理解这一点,但这正是我最需要的 :/ - Kevin mtk
3
sleep() 的参数单位为秒,而不是毫秒。因此应该写成 sleep(10) :) - Rasmus
这个在多实例应用中能工作吗?在扩展后,客户端是否仍会向同一服务器发送新请求? - Edwin Vivek N

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