Discuz 的 session 机制

discuz 没有用 php 内置的 session 机制,而是使用了本身的方式(而且每次初始化页面都会清空 $_SESSION 变量),这会让不了解的人产生迷惑。php

discuz的session实现

discuz 使用两张内存表分别存储后台用户和前台用户数据,在数据库中能够看到有两个 SESSION 表: 一个是pre_common_adminsession,是管理员登陆后台的 SESSION 表; 另外一个是pre_common_session 表,是全部用户在前台浏览页面时的 SESSION 表。 这两个表都是内存表(内存表的读写速度远高于 MYISAM 表及文本文件)。数据库

获取 session 的引用

在 discuz 的根目录下创建测试文件,test.php,添加内容:cookie

<?php
    //因为没有使用 $_SESSION 变量,因此不须要 session_start() 函数。
    // init discuz x3
    require dirname(__FILE__). '/source/class/class_core.php';
    $discuz = C::app();
    $discuz->init();
    //var_dump($_G); // for debug
    var_dump($discuz->session); // for debug

    // discuz x2
    /*
    require dirname(__FILE__). '/source/class/class_core.php';
    $discuz = & discuz_core::instance();
    $discuz->init();
    */

获取cookie中的 session id

discuz 的 session id 是其本身控制的,因此这么获取session

<?php
    require dirname(__FILE__). '/config/config_global.php'; //discuz 的配置文件
    $c_pre = $_config['cookie']['cookiepre'].substr(md5($_config['cookie']['cookiepath'].'|'.$_config['cookie']['cookiedomain']), 0, 4).'_';
    $sid = $_COOKIE[$c_pre.'sid'];

什么时候使用

  • 整合其余系统
    • 登录状态同步。其余系统在登录入口处检测 discuz 登录状态,若已登录则同步其登录状态(经过把用户信息写到 cookie 和 session 或 数据库 里实现)

目录及变量均为 discuz x3,其余版本或略有差别app

discuz 的 session 好像是不能存放本身的数据的,由于表的字段是固定的。dom

相关文章
相关标签/搜索