如何正確的在網站系統中指定 session 的路徑

由於現代網站系統大部份都已使用 MVC 架構開發,各功能套件大多也寫成模組
例如我們可能會建立一個 Session 類,裡面都為靜態方法,用這樣來管理 Session

class Session
{
    
    public static function init()
    {
        session_set_cookie_params(time() + 3600, '/');
        @session_start();
        ini_set('default_charset','utf-8');  
    }
    
    public static function set($key,$value)
    {
        $_SESSION[$key] = $value;
    }    

    public static function get($key)
    {
        if(isset($_SESSION[$key]))
            return $_SESSION[$key];
    }
    
    public static function destroy()
    {
        //unset($_SESSION);
        session_destroy();
    }
}

假設我們只在用戶要登入時,也就是登入頁面時才開始使用 session,呼叫靜態類的 init() 方法

Session::init();

但其實如果你觀察 session 系統預設路徑,會發現 session 從用戶一進入網站時就建立了

如果我們在剛剛的 Session 類中加入了指定路徑

class Session
{
    
    public static function init()
    {
        session_save_path(SESSION_TMP);  //常數SESSION_TMP由config.php設定, 為session路徑
        session_set_cookie_params(time() + 3600, '/');
        @session_start();
        ini_set('default_charset','utf-8');  
    }

你會發現網站變的很奇怪,可以登入,但登入後確無法使用任何功能
這是因為 session 在建立時使用了我們設定的路徑,但在使用網站功能時的檢查,卻去找系統預設的 session 路徑,也就是

/var/lib/php/session

所以導致了用戶輸入了正確的帳號密碼,但是卻無法使用任何功能

如果要自行指定 session 路徑,因該要在網站系統的 index.php 首頁就指定 session 路徑,這樣才可以統一所使用的路徑

所以剛剛的 Session 類要改成

class Session
{
    
    public static function init()
    {
        // 需要一開始就由首頁 index.php 設定好 session path
        //session_save_path(SESSION_TMP);
        session_set_cookie_params(time() + 3600, '/');
        @session_start();
        ini_set('default_charset','utf-8');  
    }

而在 index.php 加入

session_save_path(SESSION_TMP);