梦想之家

PHP实现用户允许几个浏览器同时登陆

/**
 * dcr163
 * 限制终端登录数量
 */
function loginOnline()
{

    //获取用户登陆限制配置
    $siteInfo = cmf_get_option('site_info');
    if( $siteInfo['user_login_online'] <= 0 ) return false;

    $userId = cmf_get_current_user_id();
    $sessionId = session_id();
    //查询所有登陆的session记录
    $list = Db::name('user_session_ids')->where('user_id', $userId)->order('create_time ASC')->select();
    $maxOnline = 2; //最多登录终端
    //session插入状态
    $insert = true;
    //获取session文件的保存路径
    $sessionPath = session_save_path().'/sess_';
    $time = time();
    //session文件按修改时间做key储存
    $fileTimes = array();

    if (!empty($list) && $list->count() >= $maxOnline) {
        foreach ($list as $k => $v) {
            if( $v['session_id'] == $sessionId ) {
                $insert = false;
                Db::name('user_session_ids')->where('session_id',$v['session_id'])->where('user_id',$userId)->update(['create_time'=>$time]);
                unset($list[$k]); //销毁这个数组
                continue;
            };
            //最后修改时间
            $sessionFile = $sessionPath.$v['session_id'];
            //session文件不存在则直接删除数据库记录
            if( !is_file($sessionFile) ) {
                Db::name('user_session_ids')->where('session_id', $v['session_id'])->where('user_id', $userId)->delete();
                continue;
            }
            //获取最后的修改时间
            $mtime = filemtime($sessionFile);
            //放到数组里,后续处理
            $fileTimes[$mtime] = $v['session_id'];
        }
        if( !empty($fileTimes) ){
            ksort($fileTimes);
            //
            $delNum = count($fileTimes)-$maxOnline;
            if( !$insert ) $delNum+=1; //如果是用户已经存在,则多删除一个用户
            $runNum = 0;
            //最少运行删除一次
            foreach ($fileTimes as $k=>$v){
                if( $runNum > 0 && $runNum >= $delNum ) break;
                Db::name('user_session_ids')->where('session_id', $v)->where('user_id', $userId)->delete();
                //删除session文件
                @unlink( $sessionPath.$v);
                ++$runNum;
            }
        }
    }
    if( $insert ){
        $savaData = array('user_id' => $userId, 'session_id' => $sessionId, 'create_time' => $time);
        Db::name('user_session_ids')->insertGetId($savaData);
    }
}


限制用户终端.png

下面这个参数是系统设置,可以自定义成为自己的 登陆终端数量,$siteInfo['user_login_online'] = 3;这样表示允许同时登陆3个用户

$siteInfo = cmf_get_option('site_info');

 PHP实现用户允许几个浏览器同时登陆,超出指定数量则把最先登陆的用户踢下线

相关推荐

您此刻的心情: