博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP如何对在线用户状态进行检测
阅读量:6164 次
发布时间:2019-06-21

本文共 6995 字,大约阅读时间需要 23 分钟。

hot3.png

   用PHP写注册登录时,经常有需要检测用户状态,今天就研究,还OK吧。不过应该还是有一些小的漏洞,先分享给大家,慢慢改进

   这里以mvc框架为例修改,当然有些是thinkPHP框架,另外修改。

    

先新建一个tags.php文件,放在配置目录Conf下。

array('OnlineCheck'), ); ?>

2.定义具体的功能

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'])) {                    // 
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); // } } } /** * 检测用户是否在线 * @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意外的处理。

OK,share it

转载于:https://my.oschina.net/bigfool007139/blog/529821

你可能感兴趣的文章
mysql做主从relay-log问题
查看>>
Docker镜像与容器命令
查看>>
批量删除oracle中以相同类型字母开头的表
查看>>
Java基础学习总结(4)——对象转型
查看>>
BZOJ3239Discrete Logging——BSGS
查看>>
SpringMVC权限管理
查看>>
spring 整合 redis 配置
查看>>
cacti分组发飞信模块开发
查看>>
浅析LUA中游戏脚本语言之魔兽世界
查看>>
飞翔的秘密
查看>>
Red Hat 安装源包出错 Package xxx.rpm is not signed
查看>>
编译安装mysql-5.6.16.tar.gz
查看>>
活在当下
查看>>
每天进步一点----- MediaPlayer
查看>>
PowerDesigner中CDM和PDM如何定义外键关系
查看>>
跨域-学习笔记
查看>>
the assignment of reading paper
查看>>
android apk 逆向中常用工具一览
查看>>
MyEclipse 报错 Errors running builder 'JavaScript Validator' on project......
查看>>
Skip List——跳表,一个高效的索引技术
查看>>