discuz 没有用 php 内置的 session 机制,而是使用了本身的方式(而且每次初始化页面都会清空 $_SESSION 变量),这会让不了解的人产生迷惑。php
discuz 使用两张内存表分别存储后台用户和前台用户数据,在数据库中能够看到有两个 SESSION 表: 一个是pre_common_adminsession
,是管理员登陆后台的 SESSION 表; 另外一个是pre_common_session
表,是全部用户在前台浏览页面时的 SESSION 表。 这两个表都是内存表(内存表的读写速度远高于 MYISAM 表及文本文件)。数据库
在 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(); */
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 x3,其余版本或略有差别app
discuz 的 session 好像是不能存放本身的数据的,由于表的字段是固定的。dom