php如何判断用户在线状态
Admin 2021-04-26 群英技术资讯 1426 次浏览
php怎么对用户在线状态进行检测?写PHP登录注册时,我们往往要对用户在线状态进行判断,很多新手不知道这一需求要如何实现,这篇文章就给大家分享php实现检测用户在线状态的代码,供大家参考学习。
这个是基于ThinkPHP框架的,其他的可以自己根据需求改
1.先新建一个tags.php文件,放在配置目录Conf下。
<?php
/*
* 添加行为
*
*/
return array(
'action_begin' => array('OnlineCheck'),
);
?>
2.定义具体的功能
<?php
/*
* 定义行为: 在线更新
*/
class OnlineCheckBehavior extends Behavior {
//行为参数
protected $options = array(
'ONLINE_CHECK' => true, // 默认进行在线
'ONLINE_CHECK_TIME' => 10, // 默认5分钟未活动,说明已下线
);
public function run(&$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 = ' delete from __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.在具体的登录方法上添加
// 登录检测
public function checkLogin() {
// $this->redirect($url);
$username = strtolower($this->_param('usr'));
$pwd = $this->_param('pwd');
$url = $this->_param('url'); // 目标地址
$is_error = false;
if (empty($username) or empty($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'])) {
// <editor-fold defaultstate="collapsed" desc="if开始">
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', '此用户已被禁止登录!');
}
// </editor-fold> 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);
// }
}
}
/**
* 检测用户是否在线
* @access private
* @param int $uid 用户ID
* @return Boolean true=不在线
*/
private function isOnline($uid) {
$ip = ip2long(get_client_ip());
$online = M('Online');
$map['uid'] = array('eq', $uid);
$list = $online->where($map)->find();
if (empty($list)) { // 不存在
return true;
} else { // 存在,检测IP是否一致,否则,检测是否超过5分钟
if ($list['lastip'] == $ip) {
return true;
} else {
if ($list['lasttime'] < time() - C('ONLINE_CHECK_TIME') * 60) {
return true;
} else {
return false;
}
}
}
}
以上就是具体的PHP在线状态检测,同一时间只有一个用户可以存在,不过还没有考虑到非正常掉线等,cookie,session意外的处理,但是先分享出来吧
对php检测用户在线状态的介绍就到这,有这方面的学习学前的朋友能够自动动手实现一下,更多细节问题也能自己去完善。更多php内容大家可以关注其他文章。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
如何用PHP实现检测上传文件大小?下文有实例供大家参考,对大家了解操作过程或相关知识有一定的帮助,而且实用性强,希望这篇文章能帮助大家,下面我们一起来了解看看吧。
本文给大家介绍在PHP中如何创建共享内存减少负载,这里大家要了解一个函数shmop,下面就跟着文章讲解来学习吧~
PHP图像处理如何获取颜色的索引值?一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解一下,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
这篇文章主要介绍了PHP中 Class self 与 static 有什么区别,都怎么用,需要的朋友们下面随着小编来一起学习学习吧
这篇文章主要介绍了php的Snoopy类案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008