基于PHP实现用户在线状态检测
这个是基于ThinkPHP框架的,其他的可以自己根据需求改
1.先新建一个tags.php文件,放在配置目录Conf下。
array('OnlineCheck'),
);
?>
2.定义具体的功能
true,//默认进行在线
'ONLINE_CHECK_TIME'=>10,//默认5分钟未活动,说明已下线
);
publicfunctionrun(&$params){
if(C('ONLINE_CHECK')){
//更新session
if((session('?login_account'))&&(time()-session('access_time')>60)){
session('access_time',time());
}
//在线更新
$ip=ip2long(get_client_ip());
$online=M('Online');
//先删除在线表中超过5分钟未活动的记录
//$sql='deletefrom__TABLE__where';
$map['lasttime']=array('lt',time()-C('ONLINE_CHECK_TIME')*60);
$icount=$online->where($map)->delete();
if(session('?login_account')){//如果是登录用户
$map=array();
$map['uid']=session('login_uid');
$map['lastip']=$ip;
$id=$online->where($map)->getField('id');
if(empty($id)){//不存在在线记录,则清空session
session(null);
}else{
$map=array();
$map['id']=array('eq',$id);
$data['lasttime']=time();
$data['lastip']=$ip;
$online->where($map)->save($data);
}
}else{//不是登录用户游客
unset($map);
$map['lastip']=array('eq',$ip);
$id=$online->where($map)->getField('id');
//dump($id);
if(empty($id)){//不存在在线记录,则添加
$data=array();
$data['uid']=0;
$data['account']='Guest';
$data['nickname']='游客';
$data['lasttime']=time();
$data['lastip']=$ip;
$online->add($data);
}else{
$map=array();
$map['id']=array('eq',$id);
$data['lasttime']=time();
$data['lastip']=$ip;
$online->where($map)->save($data);
}
}
}
}
}
?>
3.在具体的登录方法上添加
//登录检测
publicfunctioncheckLogin(){
//$this->redirect($url);
$username=strtolower($this->_param('usr'));
$pwd=$this->_param('pwd');
$url=$this->_param('url');//目标地址
$is_error=false;
if(empty($username)orempty($pwd)){
$this->assign('error_msg','用户名和口令不能为空');
$is_error=true;
}
if(!$is_error){
$model=M('Usr');
$map['account']=$username;
$map['upwd']=strtoupper(md5($pwd));
$icount=$model->where($map)->count();
if($icount==1){
$list=$model->where($map)->find();
//检测用户是否在线
if($this->isOnline($list['id'])){
//
if($list['status']){
session('login_account',$username);
session('login_nickname',$list['nickname']);
session('last_time',toDate($list['last_time']));
if($list['last_ip']){
session('last_ip',long2ip($list['last_ip']));
}else{
session('last_ip',get_client_ip());
}
session('login_count',$list['login_count']);
session('login_uid',$list['id']);
session('login_pwd',$list['upwd']);
session('access_time',time());//用户最后点击页面时间session超时使用
///
$map['id']=$list['id'];
$data['last_time']=time();
$data['last_ip']=ip2long(get_client_ip());
$model->where($map)->save($data);
$model->where($map)->setInc('login_count',1);
//检测是否有同一IP的记录,有更新,否则添加
$online=M('Online');
$map=array();
$map['lastip']=ip2long(get_client_ip());
$online_id=$online->where($map)->getField('id');
if(empty($online_id)){
//插入在线用户表
$data=array();
$data['uid']=$list['id'];
$data['account']=$list['account'];
$data['nickname']=$list['nickname'];
$data['lasttime']=time();
$data['lastip']=ip2long(get_client_ip());
$online->add($data);
}else{
//更新在线用户表
$data=array();
$data['uid']=$list['id'];
$data['account']=$list['account'];
$data['nickname']=$list['nickname'];
$data['lasttime']=time();
//$data['lastip']=ip2long(get_client_ip());
$online->where($map)->save($data);
}
}else{
$is_error=true;
$this->assign('error_msg','此用户已被禁止登录!');
}
//if结束
}else{
$is_error=true;
$this->assign('error_msg','此用户名已在其他电脑登陆,请'.C('ONLINE_CHECK_TIME').'分钟后再试!');
}
}else{
$is_error=true;
$this->assign('error_msg','错误的用户名或口令!');
}
}
if($is_error){
$this->display('login');
}else{
$this->redirect('Index/index');
//if(empty($url)){
//$this->redirect('Index/index');
//}else{
//$this->redirect($url);
//}
}
}
/**
*检测用户是否在线
*@accessprivate
*@paramint$uid用户ID
*@returnBooleantrue=不在线
*/
privatefunctionisOnline($uid){
$ip=ip2long(get_client_ip());
$online=M('Online');
$map['uid']=array('eq',$uid);
$list=$online->where($map)->find();
if(empty($list)){//不存在
returntrue;
}else{//存在,检测IP是否一致,否则,检测是否超过5分钟
if($list['lastip']==$ip){
returntrue;
}else{
if($list['lasttime']