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); } }<p><br/>

Dcr163的博客
http://dcr163.cn/262.html(转载时请注明本文出处及文章链接)