使用PHP会话的AJAX长轮询
我有以下资料: 脚本:使用PHP会话的AJAX长轮询,php,jquery,ajax,session,Php,Jquery,Ajax,Session,我有以下资料: 脚本: function poll(){ $.ajax({ ... url: poll.php, success: function(res){ $('#count').html(res); poll(); } }); } poll(); poll.php: session_start(); $count = $_SESSION['count']; s
function poll(){
$.ajax({
...
url: poll.php,
success: function(res){
$('#count').html(res);
poll();
}
});
}
poll();
poll.php:
session_start();
$count = $_SESSION['count'];
session_write_close();
while(true){
$newcount = $_SESSION['count'];
if($newcount != $count){
$count = $newcount;
break;
}
sleep(1);
}
echo $count;
在我的php中,当$\u会话['count']
发生更改时,它会中断while循环,然后更新DOM元素“\count
,然后再次轮询更改。但我的问题是,当我试图从另一个实例更改$\u会话['count']
时,运行轮询的实例一直在等待请求完成。这意味着在我的poll.php
中,即使我从另一个实例更改了$\u会话['count']
,它也不会中断while循环
这里有什么问题?在您完成会话\u write\u close()
后,会话将关闭。这意味着进一步的更改不会反映在$\u会话中
您需要重新打开会话才能从中读取:
session_start();
$count = $_SESSION['count'];
session_write_close();
while(true){
session_start();
$newcount = $_SESSION['count'];
session_write_close();
if($newcount != $count){
$count = $newcount;
break;
}
sleep(1);
}
echo $count;
然而,请注意,在Web服务器上运行这样的无限循环通常不是一个好主意。您可以很容易地让自己面临拒绝服务攻击:在无限循环中运行的每个php会话都在消耗内存和与web服务器的开放连接,因此您很快就会发现web服务器无法响应请求,因为它的所有工作人员都在无限循环中旋转
如果您确实需要在PHP中执行此操作,我强烈建议工作人员在一段时间后自动退出。更好的做法是使用专门用于长轮询的其他技术(例如,node.js WebSockets服务器)。您在哪里更改会话['count']
?(它不在您粘贴的代码中。)@jb我只是使用session_start()执行一个php
和$\u会话['count']=anynum
;