ghjbk

这个是基于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意外的处理,但是先分享出来吧,以后改进了再说。呵呵

 

分类:

技术点:

相关文章:

  • 2021-11-03
  • 2021-12-07
  • 2021-10-16
  • 2022-01-04
  • 2021-12-10
  • 2021-08-07
  • 2021-11-13
  • 2021-11-02
猜你喜欢
  • 2021-11-03
  • 2021-12-31
  • 2021-11-10
  • 2021-11-03
  • 2021-12-25
  • 2021-11-03
  • 2021-11-03
相关资源
相似解决方案