0

0

TP使用行为,实现在线用户检测

php中文网

php中文网

发布时间:2016-06-07 11:45:16

|

1737人浏览过

|

来源于php中文网

原创

通过的TP的行为实现在线用户检测,实现同一个用户名仅允许一个在线。
tags.php文件,放在配置目录Conf下。
/*
 * 添加行为
 *
 */
return array(
    'action_begin' => array('OnlineCheck'),
);
?>
行为定义:
/*
 * 定义行为: 在线更新
 */

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);
                }
            }
        }
    }

}

?>
用户登录: // 登录检测
    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']                      return true;
                } else {
                    return false;
                }
            }
        }
    }

AD:真正免费,域名+虚机+企业邮箱=0元

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

150

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

88

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

90

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

61

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

493

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

16

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

12

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

5

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.4万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号