所谓ajax长轮询,简单说就是客户端发起ajax请求,服务端会挂起该请求(通过循环),直到条件触发使服务器返回,在服务器返回前客户端一直处于pending,等待服务器返回。
ajax长轮询可以减少客户端的无用请求,不过服务端的压力会大一些。另外可以采用websocket实现推送,不过兼容性会差些,有些浏览器不支持websocket。
下面的代码可实现Comet:
服务端代码:
<?php
//server.php 服务端
set_time_limit(0);
$filename = './data.txt';
//模拟新消息到来
if (!empty($_GET['m'])) {
file_put_contents($filename, $_GET['m']);
exit(0);
}
$old = filemtime($filename);
$cur = filemtime($filename);
while ( $cur <= $old) {
usleep(500000);//休息500ms
clearstatcache();
$cur = filemtime($filename);
}
echo file_get_contents($filename)
?>
客户端代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="../jquery/jquery-1.9.0.min.js"></script>
<title>ajax</title>
</head>
<body>
<button id="click1">click1</button>
<script>
var sending=false;
$(function(){
$("#click1").click(function(){
$.ajax({
type:"POST",
url:"server.php",
timeout:0,
beforeSend:function(){
if (sending) {
return false;
}
sending = true;
},
data:"username=eddy&password=123456",
success:function(data){
alert(data);
},
error:function(data){
;
},
complete:function(){
sending=false;
$("#click1").click();
}
});
});
});
</script>
</body>
</html>
点击click1按钮,发起请求,等待服务端返回(新消息到来)。此时可通过访问 /server.php?m=1234568798798000 模拟消息到达,消息到达服务端返回数据,客户端弹出消息内容。