在PHP中使用$_SESSION來操作session,而ThinkPHP提供了session的封裝函數session()。單單這一個函數就實現了session的增刪改查的功能。下面我們分別來看其應用與實現。
該session()函數的定義是在Common/functions.php中定義。
session配置
session($name='',$value='')函數有兩個參數,$name為數組的時候是對session進行設置。使用如下:
$name = array( ‘name'=>'name', ‘path'=>'/tmp/', ‘expire'=>0 ); session($name);
這些是在開啟session之前進行設置的。在ThinkPHP中定義該函數的時候是先判斷$name是否為數組,如果為數組的話就說明是在對session進行設置,然後進入相應的代碼執行設置。
其實現代碼如下:
if(is_array($name)) { // session初始化 在session_start 之前調用 if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']); if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){ session_id($_REQUEST[C('VAR_SESSION_ID')]); }elseif(isset($name['id'])) { session_id($name['id']); } if('common' != APP_MODE){ // 其它模式可能不支持 ini_set('session.auto_start', 0); } if(isset($name['name'])) session_name($name['name']); if(isset($name['path'])) session_save_path($name['path']); if(isset($name['domain'])) ini_set('session.cookie_domain', $name['domain']); if(isset($name['expire'])) { ini_set('session.gc_maxlifetime', $name['expire']); ini_set('session.cookie_lifetime', $name['expire']); } if(isset($name['use_trans_sid'])) ini_set('session.use_trans_sid',$name['use_trans_sid']?1:0); if(isset($name['use_cookies'])) ini_set('session.use_cookies', $name['use_cookies']?1:0); if(isset($name['cache_limiter'])) session_cache_limiter($name['cache_limiter']); if(isset($name['cache_expire'])) session_cache_expire($name['cache_expire']); if(isset($name['type'])) C('SESSION_TYPE',$name['type']); …… }
在ThinkPHP中,對於session的存儲系統提供了mysql和memache兩種數據庫。當然默認情況下是使用文件存儲。判斷session存儲方式的代碼如下:
if(C('SESSION_TYPE')) { // 讀取session驅動 $type = C('SESSION_TYPE'); //系統調用mysql驅動程序 $class = strpos($type,'\\')? $type : 'Think\\Session\\Driver\\'. ucwords(strtolower($type)); $hander = new $class(); //實例化處理器 //注冊處理器 session_set_save_handler( array(&$hander,"open"), array(&$hander,"close"), array(&$hander,"read"), array(&$hander,"write"), array(&$hander,"destroy"), array(&$hander,"gc") ); }
對於session存儲系統的配置是通過配置選項SESSION_TYPE來設置的。
SESSION_TYPE=>'Mysql' //將session存儲在mysql數據庫中
設置完成以後如果設置了session自動啟動,那系統會自動開啟session
// 啟動session if(C('SESSION_AUTO_START')) session_start();
如果想關閉session自啟動,對選項SESSION_AUTO_START設置如下:
SESSION_AUTO_START => false
如果關閉了系統自啟動,可以在項目的公共文件或者在控制器中通過手動調用session_start()來開啟session。或者使用函數session(),其開啟方法如下:
session(‘[start]');
在ThinkPHP中其實現代碼如下:
if('[pause]'==$name){ // 暫停session session_write_close(); }elseif('[start]'==$name){ // 啟動session session_start(); }elseif('[destroy]'==$name){ // 銷毀session $_SESSION = array(); session_unset(); session_destroy(); }elseif('[regenerate]'==$name){ // 重新生成id session_regenerate_id(); }
session賦值
session賦值比較簡單,直接使用:
session('name','onmpw');
除此之外對於鍵值還可以是多層的中間使用‘.'連接。
session(‘name1.name2','onmpw'); //等價於 $_SESSION[‘name1'][‘name2'] = ‘onmpw';
在ThinkPHP中對於session賦值的實現代碼如下:
if(strpos($name,'.')){ list($name1,$name2) = explode('.',$name); if($prefix){ $_SESSION[$prefix][$name1][$name2] = $value; }else{ $_SESSION[$name1][$name2] = $value; } }else{ if($prefix){ $_SESSION[$prefix][$name] = $value; }else{ $_SESSION[$name] = $value; } }
$prefix是通過選項SESSION_PREFIX來配置的。
session取值
session取值相對來說也是比較簡單的。
首先是獲取全部的session,使用方法如下
$values = session();
此時得到的是一個數組。在ThinkPHP中實現代碼如下:
if(''===$name){ // 獲取全部的session return $prefix ? $_SESSION[$prefix] : $_SESSION; }
再就是取出單個值
$value1 = session(‘name'); //或者 $value2 = session(‘name1.name2');
其實現代碼如下:
if(strpos($name,'.')){ list($name1,$name2) = explode('.',$name); return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:null; }else{ return isset($_SESSION[$name])?$_SESSION[$name]:null; }
session刪除
session的刪除分為清空session,銷毀session和刪除單個session值。
先說清空session。清空session傳參給$name的值為null
session(null); //清空session
其實現代碼如下:
if(is_null($name)){ // 清空session if($prefix) { unset($_SESSION[$prefix]); }else{ $_SESSION = array(); } }
清空session只是將session對應的文件或者表中的數據清除,但是文件還是會存在的。
銷毀session
session(‘[destroy]');
其ThinkPHP中的實現代碼如下:
if('[destroy]'==$name){ // 銷毀session $_SESSION = array(); session_unset(); session_destroy(); }
銷毀session和清空session不同的是銷毀session會將文件一並銷毀。
最後就是刪除單個session值。使用方式如下
session(‘name',null);
刪除單個session值,將第二個參數$value的值設為null即可刪除。
if(is_null($value)){ // 刪除session if(strpos($name,'.')){ list($name1,$name2) = explode('.',$name); if($prefix){ unset($_SESSION[$prefix][$name1][$name2]); }else{ unset($_SESSION[$name1][$name2]); } }else{ if($prefix){ unset($_SESSION[$prefix][$name]); }else{ unset($_SESSION[$name]); } } }
檢查session
最後簡單介紹對session的檢查。檢查是指一個變量是否存在。原生的PHP檢查session變量是這樣檢查的
isset($_SESSION[‘name']);
ThinkPHP封裝之後使用session()函數是這樣檢查
session(‘?name'); //判斷一個session是否已經設置
其代碼實現也是利用了原生的檢查的方式
$name = substr($name,1); if(strpos($name,'.')){ // 支持數組 list($name1,$name2) = explode('.',$name); return $prefix?isset($_SESSION[$prefix][$name1][$name2]):isset($_SESSION[$name1][$name2]); }else{ return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]); }
以上幾乎是對session()函數各個功能的使用介紹,以及ThinkPHP是如何實現的。希望本文的內容對大家在使用ThinkPHP過程中起到一些幫助作用。