ThinkPHP 3.2.3 中設置和使用 Session

Session 的配置

能夠在 config.php(能夠是應用公用的 config.php 或模塊的 config.php)中對 Session 進行配置,例如:php

config.phpthinkphp

<?php
return array(
    //'配置項'=>'配置值'
    'SESSION_AUTO_START' =>false,//系統不自動啓動Session
    'SESSION_OPTIONS'=>array(
        'use_trans_sid'=>1,
        'expire'=>3600,//設置過時時間session.gc_maxlifetime的值爲1小時
    )
);

其中默認狀況下,初始化以後系統會自動啓動 Session,也就是 session.auto_start = 1。能夠取消 Session 的自動啓動,由於雖然若是開啓了此選項,每次使用 Session 的時候無需調用 session_start(),可是因爲不能將對象放入 Session,由於類定義必須在啓動 Session 以前加載。閉自動啓動後能夠項目的公共文件或者在控制器中經過手動調用 session_start() 或者 session('[start]') 啓動 session。數組

 

能夠在配置文件的 'SESSION_OPTIONS' 中進行配置的選項有:cookie

參數名 說明
id session_id值
name session_name 值
path session_save_path 值
prefix session 本地化空間前綴
expire session.gc_maxlifetime 設置值
domain session.cookie_domain 設置值
use_cookies session.use_cookies 設置值
use_trans_sid session.use_trans_sid 設置值
type session處理類型,支持驅動擴展

 

系統還提供了 Session 管理和操做的完善支持,所有操做能夠經過一個內置的 session 函數完成,該函數能夠完成 Session 的設置、獲取、刪除和管理操做。 session

若是 session 方法的第一個參數傳入數組則表示進行 session 初始化設置,上面經過在 config.php 中進行的配置用內置的 session 函數能夠達到相同的效果:框架

session(array('use_trans_sid'=>1,'expire'=>3600));    

注意:使用該種方式設置 Session 參數時,須要把該方法寫在 session_start() 函數以前(若是 Session 沒有設置爲自動開啓)。dom

 

Session 的使用

系統提供了Session 管理和操做的完善支持,所有操做能夠經過一個內置的 session 函數完成,該函數能夠完成Session的設置、獲取、刪除和管理操做。函數

session 函數位於 \ThinkPHP\Conmon\functions.php 內,源碼:ui

  1 /**
  2  * session管理函數
  3  * @param string|array $name session名稱 若是爲數組則表示進行session設置
  4  * @param mixed $value session值
  5  * @return mixed
  6  */
  7 function session($name='',$value='') {
  8     $prefix   =  C('SESSION_PREFIX');
  9     if(is_array($name)) { // session初始化 在session_start 以前調用
 10         if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']);
 11         if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){
 12             session_id($_REQUEST[C('VAR_SESSION_ID')]);
 13         }elseif(isset($name['id'])) {
 14             session_id($name['id']);
 15         }
 16         if('common' == APP_MODE){ // 其它模式可能不支持
 17             ini_set('session.auto_start', 0);
 18         }
 19         if(isset($name['name']))            session_name($name['name']);
 20         if(isset($name['path']))            session_save_path($name['path']);
 21         if(isset($name['domain']))          ini_set('session.cookie_domain', $name['domain']);
 22         if(isset($name['expire']))          {
 23             ini_set('session.gc_maxlifetime',   $name['expire']);
 24             ini_set('session.cookie_lifetime',  $name['expire']);
 25         }
 26         if(isset($name['use_trans_sid']))   ini_set('session.use_trans_sid', $name['use_trans_sid']?1:0);
 27         if(isset($name['use_cookies']))     ini_set('session.use_cookies', $name['use_cookies']?1:0);
 28         if(isset($name['cache_limiter']))   session_cache_limiter($name['cache_limiter']);
 29         if(isset($name['cache_expire']))    session_cache_expire($name['cache_expire']);
 30         if(isset($name['type']))            C('SESSION_TYPE',$name['type']);
 31         if(C('SESSION_TYPE')) { // 讀取session驅動
 32             $type   =   C('SESSION_TYPE');
 33             $class  =   strpos($type,'\\')? $type : 'Think\\Session\\Driver\\'. ucwords(strtolower($type));
 34             $hander =   new $class();
 35             session_set_save_handler(
 36                 array(&$hander,"open"), 
 37                 array(&$hander,"close"), 
 38                 array(&$hander,"read"), 
 39                 array(&$hander,"write"), 
 40                 array(&$hander,"destroy"), 
 41                 array(&$hander,"gc")); 
 42         }
 43         // 啓動session
 44         if(C('SESSION_AUTO_START'))  session_start();
 45     }elseif('' === $value){ 
 46         if(''===$name){
 47             // 獲取所有的session
 48             return $prefix ? $_SESSION[$prefix] : $_SESSION;
 49         }elseif(0===strpos($name,'[')) { // session 操做
 50             if('[pause]'==$name){ // 暫停session
 51                 session_write_close();
 52             }elseif('[start]'==$name){ // 啓動session
 53                 session_start();
 54             }elseif('[destroy]'==$name){ // 銷燬session
 55                 $_SESSION =  array();
 56                 session_unset();
 57                 session_destroy();
 58             }elseif('[regenerate]'==$name){ // 從新生成id
 59                 session_regenerate_id();
 60             }
 61         }elseif(0===strpos($name,'?')){ // 檢查session
 62             $name   =  substr($name,1);
 63             if(strpos($name,'.')){ // 支持數組
 64                 list($name1,$name2) =   explode('.',$name);
 65                 return $prefix?isset($_SESSION[$prefix][$name1][$name2]):isset($_SESSION[$name1][$name2]);
 66             }else{
 67                 return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]);
 68             }
 69         }elseif(is_null($name)){ // 清空session
 70             if($prefix) {
 71                 unset($_SESSION[$prefix]);
 72             }else{
 73                 $_SESSION = array();
 74             }
 75         }elseif($prefix){ // 獲取session
 76             if(strpos($name,'.')){
 77                 list($name1,$name2) =   explode('.',$name);
 78                 return isset($_SESSION[$prefix][$name1][$name2])?$_SESSION[$prefix][$name1][$name2]:null;  
 79             }else{
 80                 return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null;                
 81             }            
 82         }else{
 83             if(strpos($name,'.')){
 84                 list($name1,$name2) =   explode('.',$name);
 85                 return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:null;  
 86             }else{
 87                 return isset($_SESSION[$name])?$_SESSION[$name]:null;
 88             }            
 89         }
 90     }elseif(is_null($value)){ // 刪除session
 91         if(strpos($name,'.')){
 92             list($name1,$name2) =   explode('.',$name);
 93             if($prefix){
 94                 unset($_SESSION[$prefix][$name1][$name2]);
 95             }else{
 96                 unset($_SESSION[$name1][$name2]);
 97             }
 98         }else{
 99             if($prefix){
100                 unset($_SESSION[$prefix][$name]);
101             }else{
102                 unset($_SESSION[$name]);
103             }
104         }
105     }else{ // 設置session
106         if(strpos($name,'.')){
107             list($name1,$name2) =   explode('.',$name);
108             if($prefix){
109                 $_SESSION[$prefix][$name1][$name2]   =  $value;
110             }else{
111                 $_SESSION[$name1][$name2]  =  $value;
112             }
113         }else{
114             if($prefix){
115                 $_SESSION[$prefix][$name]   =  $value;
116             }else{
117                 $_SESSION[$name]  =  $value;
118             }
119         }
120     }
121     return null;
122 } 

分析該方法的源碼:spa

Line:9 若是 session() 的第一個參數是數組的話,則是配置 Session

Line:10 若是該數組中包含表示前綴的 prefix 參數,則把該參數寫入配置

Line:11 若是配置中包含表示 Session ID 的選項 VAR_SESSION_ID 而且存在經過 GET、POST 或 COOKIE 傳遞來的配置中 VAR_SESSION_ID 的值,則把 Session ID 設置爲傳遞近來的配置中 VAR_SESSION_ID 的值;若是數組中含有 id,則把 Session ID 設置爲 id。這兩種方式都是用來手動設置 Session ID,例如在 PHP 腳本中設置

session(array('id'=>'set_session_id_manual'));    

則打印 session_id() 函數就會獲得手動設置的 set_session_id_manual 的值

Line:16 若是 APP_MODE 等於 common 時,設置 session 不自動啓動。APP_MODE 的常量在框架入口文件 ThinlPHP/ThinkPHP.php 中設置,表示應用模式,默認爲普通模式。因爲 ThinkPHP 的系統流程是先載入框架入口文件 ThinkPHP.php,再加載慣例配置文件(普通模式是)ThinkPHP/Conf/convention.php,最後加載應用配置文件(普通模式是)Application/Common/Conf/config.php。因此在默認狀況下慣例配置文件中的設置

'SESSION_AUTO_START'    =>  true

會覆蓋框架入口文件中的

ini_set('session.auto_start', 0);

也就是說在 ThinkPHP 3.2.3 中,默認狀況下,Session 是自動開啓的,不須要每次使用 Session 的時候調用 session_start() 函數。 

Line:19 - 30 當參數數組中含有 name、path、domain、expire、use_trans_sid、use_cookies、cache_limiter、cache_expire、type 等值時分別對 session_name、session_save_path、session_cache_limiter、session_cache_expire 等函數進行賦值或者 php.ini 中的相應參數 session.cookie_domain、session.use_trans_sid、session.use_cookies、session.gc_maxlifetime、session.cookie_lifetime 進行設置。

Line:31 - 42 讀取 Session 驅動。若是沒有采起默認的文件存儲 Session 的方式,例如在 config.php 中配置了

<?php
return array(
    'SESSION_TYPE'=>'Db'
);

那麼就會自動加載 ThinkPHP/Library/Think/Session/Driver/Db.class.php,使用 Db 的方式來存儲 Session。 

Line:44 若是配置中 SESSION_AUTO_START 的值爲 True,則開啓 Session:session_start()

Line:45 當 session() 的第二個參數爲 '' 時,表示 Session 的取值

$username= session('username');

Line:46 當 session() 的一個參數也爲 '' 時,便是獲取所有的 session

return $prefix ? $_SESSION[$prefix] : $_SESSION;

這是 3.2.3 版本增長的獲取全部 session 的方法:

$session_info = session();

Line:49 Session 操做

Line:61 檢查 Session

3.2.3 版本新增長的功能,支持二維數組取值,例如

$uid = session('user.uid');

Line:69 清空 Session

Line:90 刪除 Session,例如

session('username',null); // 刪除username

3.2.3 版本開始支持刪除二維數組:

session('user.uid',null); // 刪除session

Line:105 Session 的賦值,例如

session('username','dee');  //設置session

3.2.3 版本開始,session 賦值操做支持二維:

session('user.uid',10);  //設置session

 

附:ThinkPHP 框架的慣例配置在 ThinkPHP/Conf/convention.php

和 Session 相關的配置有:

    /* SESSION設置 */
    'SESSION_AUTO_START'    =>  true,    // 是否自動開啓Session
    'SESSION_OPTIONS'       =>  array(), // session 配置數組 支持type name id path expire domain 等參數
    'SESSION_TYPE'          =>  '', // session hander類型 默認無需設置 除非擴展了session hander驅動
    'SESSION_PREFIX'        =>  '', // session 前綴
    //'VAR_SESSION_ID'      =>  'session_id',     //sessionID的提交變量

 

 

參考:http://www.kancloud.cn/manual/thinkphp/1872

相關文章
相關標籤/搜索