能夠在 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 函數位於 \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的提交變量