create table msg{
msgid int not null primary key auto_increment,
sender char(16) not null,
receiver char(16) not null,
content text, //信息内容用text类型,存储量可达到65535字符
senderRead tinyint enum(0,1) default 0,
receiverRead tinyint enum(0,1) default 0 //设置一个是否已读的flag标记
}
set_time_limit(0);//设置脚本超时时间为无限,不然在过了超时时间后脚本会自动关闭,轮询失败。
$link=new mysqli("host","user","password","database");
$search="select sender,receiver,content from msg where receiverRead=0 limit 1";//限制每次读出一条数据,便于修改其已读flag
$change="update chat set receiverRead=1 where receiverRead=0 limit 1";
while (true) { //进入无限循环
$res=$link->query($sql); //查询结果
if($res->num_rows!=0){ //当有未读信息时读取信息
$link->query($change);//将信息的已读flag设为1
$msg=$res->fetch_assoc();
$jsonstr=json_encode($msg);//取到信息,将信息用转码为json格式,返回给JS
echo $jsonstr;
break;//输出信息后退出while循环,结束当前脚本
}
usleep(1000);//如果没有信息不会进入if块,但会执行一下等待1秒,防止PHP因循环假死。
}
function link(){
var xhr=null;//先设置xhr为空,为了轮询时再次调用函数对xhr重用,引发错误
xhr=new XMLHttpRequest();
xhr.open('GET','serviceback.php',true);//第三个参数一定要设置为true,异步不阻塞,不会影响到后面JS的执行。
xhr.send();
xhr.onreadystatechange=function(){
if (xhr.readyState==4) { 严密也可加使用(xhr.readyState==4 && xhr.status ==200)限定服务器响应码为200时才进行处理。
if(xhr.responseText!=''){
process... //服务器端返回信息,且返回信息不为空,则开始处理返回信息。
}
setTimeout("link()",300);
//递归再次调用link()函数,用setTimeOut()设置延时是因为服务器端进行sql操作时会耗时,当有新信息时,在服务器将要置已读flag为1还未成功时,AJAX可能已经又发出多条查询信息了,会导致一条信息多次返回。
}
};
}
var link={ //jQuery的AJAX执行的配置对象
type:"GET", //设置请求方式,默认为GET,
async:true, //设置是否异步,默认为异步
url:"customback.php",
dataType:"json", //设置期望的返回格式,因服务器返回json格式,这里将数据作为json格式对待
success:function (msg){
process...
setTimeout("link()",300);
} //成功时的回调函数,处理返回数据,并且延时建立新的请求连接
}
$.ajax(link); //执行ajax请求。
]
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有