基于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']