常轮询的方式
作者:互联网
常轮询的方式:
- 长连接
即服务器端不断开联系,PHP服务器端用ob系列函数来不停的读取输出,但是相当耗费服务器资源。
- Flash socket
flash的as3语言,创建一个socket服务器用来处理信息。
- 轮询
顾名思义就是不停地发送查询消息,一有新消息立刻更新,但是会有多次无用请求。(点带宽,客户端消耗CPU及内存)
- 长轮询
是轮询的升级版,需要服务器端的配合。(服务器端消耗CPU及内存)
- websocket
HTML5的通信功能,建立一个与服务器端的专用接口ws协议来进行通讯,兼容可能成为问题
长轮询的服务器端实现:
数据库:标记位,记录内容是否推送过 is_read
PHP:
设置超时时间与当前时区
这里的超时时间不会生效,因为php.ini nginx.cof中都有关于超时时间的设置
//关于循环中unset()反而会增加内存,这一点我没有试
//设置脚本超时时间为无限,不然在过了超时时间后脚本会自动关闭,轮询失败。
set_time_limit(0);
date_default_timezone_set('PRC');
//判断当前是否是ajax请求
if (IS_AJAX && IS_POST) {
$i = 0; //设置这个有个好处,就是在服务器30秒连接超时前自己释放连接
while (true) { //进入无限循环
//根据条件查询数据库每次取一条数据,为了好处理
if ('数据') {//当有未读信息时读取信息
//是否有别的条件 -------------------
//注意,此处要处理一下自己点赞后直接跳出循环
if('当前是自己'){
break;//输出信息后退出while循环,结束当前脚本
}
//更新当前数据状态为已读取
if('更新成功'){
//处理返回的数据
echo json_encode('要返回的数据,注意里面必须为UTF-8');
break;//输出信息后退出while循环,结束当前脚本
}
}
sleep(1);//如果没有信息不会进入if块,但会执行一下等待?秒,防止PHP因循环假死。usleep一微秒等于百万分之一秒。
if($i > 28){ //这个地方就是28秒退出循环
break;
}
$i++;
}
}
js
//这个是请求的ajax
var link = function(){
$.ajax({
url:url,
type:'post',
data:data,
dataType:'json',
success:ajax_callback,
error:link //这个地方有意思嘛,请求失败后重新发起请求
});
};
//这个是请求成功后的回调
var ajax_callback = function(data){
//数据处理去吧
setTimeout(link, 300); //300毫秒后接着去请求去 注意是方法名不还()
}
做这个之后一定要测试注意服务器cup与内存
标签:服务器端,方式,轮询,ajax,循环,超时,请求 来源: https://www.cnblogs.com/fuqian/p/16267470.html