【discuzX2】/source/class/class_core.php文件中session会话类discuz_session分析
2013-08-09 10:42
721 查看
<?php //session类,session机制,discuz中session信息存储在数据库中,而不是存储在硬盘上 class discuz_session { var $sid = null; var $var; var $isnew = false; //初始化session数组 var $newguest = array('sid' => 0, 'ip1' => 0, 'ip2' => 0, 'ip3' => 0, 'ip4' => 0, 'uid' => 0, 'username' => '', 'groupid' => 7, 'invisible' => 0, 'action' => 0, 'lastactivity' => 0, 'fid' => 0, 'tid' => 0, 'lastolupdate' => 0); var $old = array('sid' => '', 'ip' => '', 'uid' => 0); function discuz_session($sid = '', $ip = '', $uid = 0) { $this->old = array('sid' => $sid, 'ip' => $ip, 'uid' => $uid); $this->var = $this->newguest; if(!empty($ip)) { $this->init($sid, $ip, $uid); } } //设置 function set($key, $value) { if(isset($this->newguest[$key])) { $this->var[$key] = $value; } elseif ($key == 'ip') { $ips = explode('.', $value); $this->set('ip1', $ips[0]); $this->set('ip2', $ips[1]); $this->set('ip3', $ips[2]); $this->set('ip4', $ips[3]); } } //获取 function get($key) { if(isset($this->newguest[$key])) { return $this->var[$key]; } elseif ($key == 'ip') { return $this->get('ip1').'.'.$this->get('ip2').'.'.$this->get('ip3').'.'.$this->get('ip4'); } } //初始化 function init($sid, $ip, $uid) { $this->old = array('sid' => $sid, 'ip' => $ip, 'uid' => $uid); $session = array(); if($sid) { $session = DB::fetch_first("SELECT * FROM ".DB::table('common_session'). " WHERE sid='$sid' AND CONCAT_WS('.', ip1,ip2,ip3,ip4)='$ip'"); } if(empty($session) || $session['uid'] != $uid) { $session = $this->create($ip, $uid); } $this->var = $session; $this->sid = $session['sid']; } //创建 function create($ip, $uid) { $this->isnew = true; $this->var = $this->newguest; $this->set('sid', random(6)); $this->set('uid', $uid); $this->set('ip', $ip); $uid && $this->set('invisible', getuserprofile('invisible')); $this->set('lastactivity', time()); $this->sid = $this->var['sid']; return $this->var; } //删除 function delete() { global $_G; $onlinehold = $_G['setting']['onlinehold']; $guestspan = 60; $onlinehold = time() - $onlinehold; $guestspan = time() - $guestspan; $condition = " sid='{$this->sid}' "; $condition .= " OR lastactivity<$onlinehold "; $condition .= " OR (uid='0' AND ip1='{$this->var['ip1']}' AND ip2='{$this->var['ip2']}' AND ip3='{$this->var['ip3']}' AND ip4='{$this->var['ip4']}' AND lastactivity>$guestspan) "; $condition .= $this->var['uid'] ? " OR (uid='{$this->var['uid']}') " : ''; DB::delete('common_session', $condition); } //更新数据 function update() { global $_G; if($this->sid !== null) { $data = daddslashes($this->var); if($this->isnew) { $this->delete(); DB::insert('common_session', $data, false, false, true); } else { DB::update('common_session', $data, "sid='$data[sid]'"); } $_G['session'] = $data; dsetcookie('sid', $this->sid, 86400); } } /** * 取在线用户数量 * * @param int $type 0=全部 1=会员 2=游客 * @return int */ function onlinecount($type = 0) { $condition = $type == 1 ? ' WHERE uid>0 ' : ($type == 2 ? ' WHERE invisible=1 ' : ''); return DB::result_first("SELECT count(*) FROM ".DB::table('common_session').$condition); } } ?>
相关文章推荐
- 【discuzX2】/source/class/class_core.php文件中session会话类discuz_session分析
- 【discuzX2】/source/class/class_core.php文件中核心高效缓存类discuz_memory分析
- 【discuzX2】/source/class/class_core.php文件中核心基础类库中discuz_core类分析
- 【discuzX2】/source/class/class_core.php文件中核心高效缓存类discuz_memory分析
- 【discuzX2】/source/class/class_core.php文件中核心基础类库中discuz_core类分析
- 【discuzX2】/source/class/class_core.php文件中数据库操作类DB及db_mysql分析
- 【discuzX2】/source/class/class_core.php文件中数据库操作类DB及db_mysql分析
- DISCUZX2.0 核心文件 class_core.php 分析之 – discuz_process
- 【discuzX2】/source/function/function_core.php通用核心函数库文件分析
- 【discuzX2】/source/function/function_core.php通用核心函数库文件分析
- discuz 3.x 核心文件class_core.php解析
- DiscuzX /source/function/function_core.php通用核心函数库文件分析
- 【thinkphp3.x】ThinkPHP/Lib/Core/View.class.php文件分析
- 【thinkphp3.x】ThinkPHP/Lib/Core/Think.class.php文件分析
- 【thinkphp3.x】ThinkPHP/Lib/Core/Model.class.php文件分析
- 【thinkphp3.x】ThinkPHP/Lib/Core/App.class.php文件分析
- 【thinkphp3.x】ThinkPHP/Lib/Core/Dispatcher.class.php文件分析
- Discuz!7.2 faq.php文件SQL注入漏洞分析及利用实战
- Discuz! X2 核心类源码(class_core.php)分析
- 【phpcms-v9】phpcms-v9中url路由规则文件分析:phpcms/libs/classes/param.class.php