- <?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);
- }
- }
- ?>