2013-02-23 31 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

它能够自动开始为所有,但并不意味着它创建开销