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

相關文章
相關標籤/搜索