2013-02-23 58 views
0

我想要一個解決方案,當我在每個php文件中首次使用變量$_SESSION時,函數session_start()被自動調用。否則不。第一次使用時自動啓動會話

我可以在auto-prepend-file中調用它或使用session.auto_start,但是當我不使用文件中的會話時,我將防止任何開銷過程。

+1

創建一個包裝類圍繞'$ _SESSION'。不要直接使用'$ _SESSION',而是使用'$ mySessionWrapper-> set('foo','bar')''。然後你可以實現你想要的任何會話開始邏輯。 – deceze 2013-02-23 11:06:20

回答

1

簡答:你不能。

但是,您可以將會話功能封裝在類中,並處理會話類中會話的開始。

class Session { 

    public function __construct() { 
     session_start(); 
    } 

    public function set($k, $v) { 
     $_SESSION[$k] = $v; 
    } 

    ... 

} 

的使用將被:

$session = new Session(); 
$session->set('key', 'value'); 

否則還有另一個醜陋的解決方案,這將免去你的session_start()$session = new Session();行:創建一個靜態類,如:

class Session { 

    private static $inited = false; 

    public static function check() { 
     if (!$inited) { 
      session_start(); 
      $inited = true; 
     } 
    } 

    public static function set($k, $v) { 
     self::check(); 
     $_SESSION[$k] = $v; 
    } 

    ... 

} 

那麼你只需要在開始時創建所有調用self::check()的方法,如果尚未初始化,它將啓動會話。和用法是簡單的:

Session::set('key', 'value'); 
1

創建一個會話類和使用Singleton模式實例是:

class Session { 
    private function __construct() { 
    session_start(); 
    } 

    private static $instance = false; 
    public static function getInstance() { 
    if(self::$instance == false) { 
     self::$instance == new Session(); 
    } 
    return self::$instance; 
    } 
} 
+2

這甚至不是單例模式:我可以將你的類實例化爲:'$ s = new Session();' – Shoe 2013-02-23 11:09:09

+0

WHy not?它的功能是確保一個實例化:http://en.wikipedia.org/wiki/Singleton_pattern – L0j1k 2013-02-23 11:10:27

+1

構造函數是公共的.-- – Shoe 2013-02-23 11:11:05

0

如果你想自動啓動一個會話,你會發現下面的線在您的php.ini文件中,並將值從0更改爲1並重新啓動您的服務器。

session.auto_start = 1

或htaccess的

php_value session.auto_start 1

它能夠自動開始爲所有,但並不意味着它創建開銷