最近看一个项目需求:服务器实时响应客户端的下单信息。第一反应是用socket来做,不过看网上评论也有ajax轮询方式。干脆自己试试。
ajax轮询:简单来说就是每隔一段时间用ajax访问后台是否有新数据。
主要load.js文件,每隔一段时间执行ajax程序
$(function(){
var getting = {
url: 'jianting.php',
type: 'POST',
dataType: 'json',
success:function(data,status) {
console.log(data);
},
error:function (res,responseText) {
// console.log(res);
console.log("aa");
}
};
window.setInterval(function() {
$.ajax(getting);
}, 5000);
});
houduan.php界面
引用js文件
src="jquery-1.9.1.min.js"
src="load.js"
jianting.php判断有无未处理的数据
$host = "localhost";
$user = "root";
$pass = "";
$conn = new mysqli($host,$user,$pass,"test");
if(mysqli_connect_errno()){
echo "error:".mysqli_connect_error();
exit;
}
$conn->set_charset('utf8');
$result = $conn->query("select * from test where status=0");
$num = $result->num_rows;
if($num>0){
$array = array('status'=>'success');
echo json_encode($array);
}else{
$array = array('status'=>'error');
echo json_encode($array);
}
if($conn->errno){
echo "error:".$conn->error;
exit;
}
ajax长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
houduan.php
这是后端
$(function () {
var getting = {
url: 'add.php',
type: 'POST',
dataType: 'json',
setTimeout:80000,
data:{time:80},
success:function(data,status) {
console.log(data);
if(data.success==1){
console.log('有数据');
$.ajax(getting);
}
if(data.success==0){
console.log('无数据');
$.ajax(getting);
}
},
error:function (XMLHttpRequest, textStatus, errorThrown) {
console.log(textStatus);
console.log(XMLHttpRequest);
console.log("aa");
}
};
$.ajax(getting);
});
add.php检测是否有新数据
$host = "localhost";
$user = "root";
$pass = "";
if(isset($_POST['time'])){
if(!empty($_POST['time'])){
$conn = new mysqli($host,$user,$pass,"test");
if(mysqli_connect_errno()){
echo "error:".mysqli_connect_error();
exit;
}
$conn->set_charset('utf8');
$i=0;
set_time_limit(0);//无限请求超时时间
while (true) {
usleep(500000);//0.5秒
$sql = "select * from test where status=1";
$num = $conn->num_rows;
$i++;
if($num>0){
$array = array('success'=>1);
echo json_encode($array);
exit;
}
if($i==$_POST['time']){
$array = array('success'=>0);
echo json_encode($array);
exit;
}
};
$conn->mysqli_close();
if($conn->errno){
echo "error:".$conn->error;
}
}else{
echo "null";
}
}