TypechoJoeTheme

Dcr163的博客

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

2021-01-13
/
0 评论
/
178 阅读
/
正在检测是否收录...
01/13
/**
 * 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&nbsp;=&nbsp;Db::name(&#39;user_session_ids&#39;)-&gt;where(&#39;user_id&#39;,&nbsp;$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)&nbsp;&amp;&amp;&nbsp;$list->count() >= $maxOnline) {
        foreach ($list&nbsp;as&nbsp;$k => $v) {
            if( $v[&#39;session_id&#39;]&nbsp;==&nbsp;$sessionId ) {
                $insert = false;
                Db::name('user_session_ids')->where('session_id',$v[&#39;session_id&#39;])-&gt;where(&#39;user_id&#39;,$userId)->update(['create_time'=>$time]);
                unset($list[$k]); //销毁这个数组
                continue;
            };
            //最后修改时间
            $sessionFile&nbsp;=&nbsp;$sessionPath.$v['session_id'];
            //session文件不存在则直接删除数据库记录
            if( !is_file($sessionFile) ) {
                Db::name('user_session_ids')->where('session_id', $v[&#39;session_id&#39;])-&gt;where(&#39;user_id&#39;,&nbsp;$userId)->delete();
                continue;
            }
            //获取最后的修改时间
            $mtime&nbsp;=&nbsp;filemtime($sessionFile);
            //放到数组里,后续处理
            $fileTimes[$mtime] = $v['session_id'];
        }
        if( !empty($fileTimes) ){
            ksort($fileTimes);
            //
            $delNum&nbsp;=&nbsp;count($fileTimes)-$maxOnline;
            if( !$insert&nbsp;)&nbsp;$delNum+=1; //如果是用户已经存在,则多删除一个用户
            $runNum = 0;
            //最少运行删除一次
            foreach ($fileTimes&nbsp;as&nbsp;$k=>$v){
                if( $runNum&nbsp;&gt;&nbsp;0&nbsp;&amp;&amp;&nbsp;$runNum >= $delNum ) break;
                Db::name('user_session_ids')->where('session_id', $v)-&gt;where(&#39;user_id&#39;,&nbsp;$userId)->delete();
                //删除session文件
                @unlink( $sessionPath.$v);
                ++$runNum;
            }
        }
    }
    if( $insert ){
        $savaData&nbsp;=&nbsp;array(&#39;user_id&#39;&nbsp;=&gt;&nbsp;$userId, 'session_id' => $sessionId,&nbsp;&#39;create_time&#39;&nbsp;=&gt;&nbsp;$time);
        Db::name('user_session_ids')->insertGetId($savaData);
    }
}
<p><br/><br/><br/>下面这个参数是系统设置,可以自定义成为自己的 登陆终端数量,$siteInfo[&#39;user_login_online&#39;] = 3;这样表示允许同时登陆3个用户<br/></p><pre class="brush:php;toolbar:false">$siteInfo = cmf_get_option('site_info');<p> PHP实现用户允许几个浏览器同时登陆,超出指定数量则把最先登陆的用户踢下线<br/></p>
赞(0)
版权属于:

Dcr163的博客

本文链接:

https://dcr163.cn/262.html(转载时请注明本文出处及文章链接)

评论 (0)