我正在尝试更多地了解长时间轮询以实时“操纵”网站,看到一些视频,我到目前为止一直在思考:
说我有一个旧日期,sql和我对它进行回音。由于长轮询将知道旧日期是否会与根据setInterval函数不时看起来相同......?
说我想展示一个博客,其中所有文本都在mysql中,但是我依旧发布一个新的出版物,当时谁在页面上,你会看到发布时间(不告诉我?)那么一个长轮询代码将如何知道旧版和新版之间的区别?吃了甚至不给冲突或重复sql上刻的相同日期。
答案 0 :(得分:6)
由于您最初的问题是两种技术之间的区别,我将从这开始:
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元素中,一旦有回调,就开始一个新的请求。
在服务器端,您通常使用循环。要解决您的问题,服务器将如何知道哪些是新的出版物:要么将最新的时间戳传递给客户端可用的发布到服务器,要么使用“长轮询开始”的时间作为indiactor:
<?
$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";
这里我们不会有“无用的”请求。