开源CMS \ discuz \ 【discuzX2】/source/class/class_core.php文件中session会话类discuz_session分析

【discuzX2】/source/class/class_core.php文件中session会话类discuz_session分析

总点击38
简介:<?php //session类,session机制,discuz中session信息存储在数据库中,而不是存储在硬盘上

<?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,$uid) {

$this->old = array('sid' => $sid,'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,true);

} else {

DB::update('common_session',"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);

}

}

?>


意见反馈 常见问题 官方微信 返回顶部