作者:浅浅的醉意_942_932 | 来源:互联网 | 2014-05-27 15:53
discuz没有用php内置的session机制,而是使用了自己的方式(并且每次初始化页面都会清空$_SESSION变量),这会让不了解的人产生迷惑。discuz的session实现discuz使用两张内存表分别存储后台用户和前台用户数据,在数据库中可以看到有两个SESSION
discuz 没有用 php 内置的 session 机制,而是使用了自己的方式(并且每次初始化页面都会清空 $_SESSION
变量),这会让不了解的人产生迷惑。
discuz的session实现
discuz 使用两张内存表分别存储后台用户和前台用户数据,在数据库中可以看到有两个 SESSION 表:
一个是pre_common_adminsession,是管理员登录后台的 SESSION 表;
另一个是pre_common_session 表,是所有用户在前台浏览页面时的 SESSION 表。
这两个表都是内存表(内存表的读写速度远高于 MYISAM 表及文本文件)。
获取 session 的引用
在 discuz 的根目录下建立测试文件,test.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 是其自己控制的,所以这么获取
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,其他版本或略有差异
discuz 的 session 好像是不能存放自己的数据的,因为表的字段是固定的。