Php AJAX长轮询不';t保持连接打开
在过去的两天里,我一直在努力让这一切顺利进行。它执行一次,但在初始加载后无法继续更新。该功能不会自动更新,30秒后也不会重新启动。代码对我来说似乎很好,但很明显,我对长轮询的了解存在一些差距,这导致了它无法工作。如果有人有时间的话,如果你能仔细梳理一下,告诉我我做错了什么,我将不胜感激。非常感谢您的帮助,谢谢 JavaScript/jQueryPhp AJAX长轮询不';t保持连接打开,php,javascript,jquery,ajax,long-polling,Php,Javascript,Jquery,Ajax,Long Polling,在过去的两天里,我一直在努力让这一切顺利进行。它执行一次,但在初始加载后无法继续更新。该功能不会自动更新,30秒后也不会重新启动。代码对我来说似乎很好,但很明显,我对长轮询的了解存在一些差距,这导致了它无法工作。如果有人有时间的话,如果你能仔细梳理一下,告诉我我做错了什么,我将不胜感激。非常感谢您的帮助,谢谢 JavaScript/jQuery function poll(pid){ var dataString = 'pid=' + pid; $.ajax({type: 'GE
function poll(pid){
var dataString = 'pid=' + pid;
$.ajax({type: 'GET', url: 'http://localhost:8888/mysite/execs/vote_count.php', data: dataString, async: true, cache: false, success: function(data){
var post = $('#' +pid);
var post_children = post.children();
var upvotes = post_children.find('.upvotes');
var downvotes = post_children.find('.downvotes');
downvotes.text("-" + data.downvotes);
upvotes.text("+" + data.upvotes);
}, dataType: "json", complete: poll, timeout: 30000 });
};
$(".post").each(function(){
poll($(this).attr("id"));
});
PHP(vote_count.PHP)
我认为您遇到的主要问题是假设complete:poll将使用当前调用中传入的参数pid。试试这个
function poll(pid){
var dataString = 'pid=' + pid;
$.ajax({type: 'GET',
url: 'http://localhost:8888/mysite/execs/vote_count.php',
data: dataString,
async: true,
cache: false,
success: function(data){
var post = $('#' +pid);
var post_children = post.children();
var upvotes = post_children.find('.upvotes');
var downvotes = post_children.find('.downvotes');
downvotes.text("-" + data.downvotes);
upvotes.text("+" + data.upvotes);
},
dataType: "json",
complete: function(xhr, status){
setTimeout(function(){poll(pid);}, 30000);
},
timeout: 30000
});
}
$(".post").each(function(){
poll($(this).attr("id"));
});
所说的,如果你有很多帖子正在检查更新,你可能会考虑捆绑这些调用并每30秒调用一次页面(并返回一个帖子更新的数组),而不是每30页每页一次。(我的额外两分钱。)
编辑:添加了提到的超时。第一次就忘了。我想一旦你收到回复。。浏览器不会也不应该保持连接打开。。而且这在很大程度上取决于您使用的浏览器和发送的标题。。我不太喜欢PHP,但是。。标头shud包含连接:保持活动状态以保持连接打开。
。
我还进行了各种测试。
1.IE不会保持现有连接打开,但将同时打开2个连接,并将保持第二个连接打开并关闭第一个连接。
2.Chrome表现良好,发送2个请求(一个用于favicon),但保持连接打开。
3.Mozilla只发送一个请求并保持打开状态。
你在用IE9测试这个吗?你说得对,这是我的主要问题。我很惊讶我没有想到这一点。然而,尽管存在这个问题,我的理解是,这个连接应该保持开放,并创建(似乎)自动更新。否则我可以使用setInterval。然而,即使在最初的30秒内,也没有任何变化。我的PHP有一个星期,但我在javascript中没有看到任何保持连接打开的内容。当AJAX调用超时时,超时所做的就是重写,jQuery每次只为每个帖子调用一次poll函数。这是一个更好、更干净的长池模式我在Chrome上,也在Mac上,它不是双启动窗口,所以即使我想,我也无法在IE9中测试它,除非我把文件转移到我朋友的公司。我的坏…(你能检查一下你从服务器上得到的响应头吗。
function poll(pid){
var dataString = 'pid=' + pid;
$.ajax({type: 'GET',
url: 'http://localhost:8888/mysite/execs/vote_count.php',
data: dataString,
async: true,
cache: false,
success: function(data){
var post = $('#' +pid);
var post_children = post.children();
var upvotes = post_children.find('.upvotes');
var downvotes = post_children.find('.downvotes');
downvotes.text("-" + data.downvotes);
upvotes.text("+" + data.upvotes);
},
dataType: "json",
complete: function(xhr, status){
setTimeout(function(){poll(pid);}, 30000);
},
timeout: 30000
});
}
$(".post").each(function(){
poll($(this).attr("id"));
});