首页
站长论坛BBS
救助
投稿
discuz视频教程
discuz技术支持
版块
登录
快速注册

class_core.php文件中session会话类discuz_session分析

ARCHY 2015-6-14 [Discuz开发] 来自PC 复制链接
24243
discuz使用视频教程
31idc

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
discuz X3/source/class/class_core.php文件中session会话类discuz_session分析,推荐阅读:Discuz中session机制流程图

  1. <?php
  2. //session类,session机制,discuz中session信息存储在数据库中,而不是存储在硬盘上
  3. class discuz_session {

  4.         var $sid = null;
  5.         var $var;
  6.         var $isnew = false;
  7.         //初始化session数组
  8.         var $newguest = array('sid' => 0, 'ip1' => 0, 'ip2' => 0, 'ip3' => 0, 'ip4' => 0,
  9.         'uid' => 0, 'username' => '', 'groupid' => 7, 'invisible' => 0, 'action' => 0,
  10.         'lastactivity' => 0, 'fid' => 0, 'tid' => 0, 'lastolupdate' => 0);

  11.         var $old =  array('sid' =>  '', 'ip' =>  '', 'uid' =>  0);

  12.         function discuz_session($sid = '', $ip = '', $uid = 0) {
  13.                 $this->old = array('sid' =>  $sid, 'ip' =>  $ip, 'uid' =>  $uid);
  14.                 $this->var = $this->newguest;
  15.                 if(!empty($ip)) {
  16.                         $this->init($sid, $ip, $uid);
  17.                 }
  18.         }

  19.         //设置
  20.         function set($key, $value) {
  21.                 if(isset($this->newguest[$key])) {
  22.                         $this->var[$key] = $value;
  23.                 } elseif ($key == 'ip') {
  24.                         $ips = explode('.', $value);
  25.                         $this->set('ip1', $ips[0]);
  26.                         $this->set('ip2', $ips[1]);
  27.                         $this->set('ip3', $ips[2]);
  28.                         $this->set('ip4', $ips[3]);
  29.                 }
  30.         }

  31.         //获取
  32.         function get($key) {
  33.                 if(isset($this->newguest[$key])) {
  34.                         return $this->var[$key];
  35.                 } elseif ($key == 'ip') {
  36.                         return $this->get('ip1').'.'.$this->get('ip2').'.'.$this->get('ip3').'.'.$this->get('ip4');
  37.                 }
  38.         }

  39.         //初始化
  40.         function init($sid, $ip, $uid) {
  41.                 $this->old = array('sid' =>  $sid, 'ip' =>  $ip, 'uid' =>  $uid);
  42.                 $session = array();
  43.                 if($sid) {
  44.                         $session = DB::fetch_first("SELECT * FROM ".DB::table('common_session').
  45.                                 " WHERE sid='$sid' AND CONCAT_WS('.', ip1,ip2,ip3,ip4)='$ip'");
  46.                 }

  47.                 if(empty($session) || $session['uid'] != $uid) {
  48.                         $session = $this->create($ip, $uid);
  49.                 }

  50.                 $this->var = $session;
  51.                 $this->sid = $session['sid'];
  52.         }

  53.         //创建
  54.         function create($ip, $uid) {

  55.                 $this->isnew = true;
  56.                 $this->var = $this->newguest;
  57.                 $this->set('sid', random(6));
  58.                 $this->set('uid', $uid);
  59.                 $this->set('ip', $ip);
  60.                 $uid && $this->set('invisible', getuserprofile('invisible'));
  61.                 $this->set('lastactivity', time());
  62.                 $this->sid = $this->var['sid'];

  63.                 return $this->var;
  64.         }

  65.         //删除
  66.         function delete() {

  67.                 global $_G;
  68.                 $onlinehold = $_G['setting']['onlinehold'];
  69.                 $guestspan = 60;

  70.                 $onlinehold = time() - $onlinehold;
  71.                 $guestspan = time() - $guestspan;

  72.                 $condition = " sid='{$this->sid}' ";
  73.                 $condition .= " OR lastactivity<$onlinehold ";
  74.                 $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) ";
  75.                 $condition .= $this->var['uid'] ? " OR (uid='{$this->var['uid']}') " : '';
  76.                 DB::delete('common_session', $condition);
  77.         }

  78.         //更新数据
  79.         function update() {
  80.                 global $_G;
  81.                 if($this->sid !== null) {

  82.                         $data = daddslashes($this->var);
  83.                         if($this->isnew) {
  84.                                 $this->delete();
  85.                                 DB::insert('common_session', $data, false, false, true);
  86.                         } else {
  87.                                 DB::update('common_session', $data, "sid='$data[sid]'");
  88.                         }
  89.                         $_G['session'] = $data;
  90.                         dsetcookie('sid', $this->sid, 86400);
  91.                 }
  92.         }

  93.         /**
  94.          * 取在线用户数量
  95.          *
  96.          * @param int $type 0=全部 1=会员 2=游客
  97.          * @return int
  98.          */
  99.         function onlinecount($type = 0) {
  100.                 $condition = $type == 1 ? ' WHERE uid>0 ' : ($type == 2 ? ' WHERE invisible=1 ' : '');
  101.                 return DB::result_first("SELECT count(*) FROM ".DB::table('common_session').$condition);
  102.         }

  103. }
  104. ?>
复制代码



更多Discuz二次开发相关源码分析
1、discuz核心类库class_core的函数注释
http://bbs.zb7.com/thread-514094-1-1.html
2、Discuz的forum_index.php文件的分析
http://bbs.zb7.com/thread-517467-1-1.html
3、discuz x3 与通知表有关的程序源代码分析
http://bbs.zb7.com/thread-517471-1-1.html
4、discuz x3 space_notice.php分析注释
http://bbs.zb7.com/thread-517472-1-1.html
5、discuz x3 uc_client/client.php接口文件分析
http://bbs.zb7.com/thread-517473-1-1.html
6、Discuz中session机制流程图
http://bbs.zb7.com/thread-517443-1-1.html
7、class_core.php文件中核心基础类库中discuz_core类分析
http://bbs.zb7.com/thread-517538-1-1.html
8、class_core.php文件中数据库操作类DB及db_mysql分析
http://bbs.zb7.com/thread-517539-1-1.html



上一篇:class_core.php文件中数据库操作类DB及db_mysql分析
下一篇:class_core.php文件中核心高效缓存类discuz_memory分析
UC955 发表于 2015-7-1 17:33:22 来自PC
这沙发是有点热,上面那都是额不认识的
洋洋 发表于 2015-7-2 11:21:21 来自PC
很给力,希望分享更多给力的帖子啊。
http://www.02lx.com http://www.xcyy0451.com
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

快速回复 返回顶部 返回列表