ThinkPHP中session函數(shù)詳解
在PHP中使用$_SESSION來(lái)操作session,而ThinkPHP提供了session的封裝函數(shù)session()。單單這一個(gè)函數(shù)就實(shí)現(xiàn)了session的增刪改查的功能。下面我們分別來(lái)看其應(yīng)用與實(shí)現(xiàn)。
該session()函數(shù)的定義是在Common/functions.php中定義。
session配置
session($name='',$value='')函數(shù)有兩個(gè)參數(shù),$name為數(shù)組的時(shí)候是對(duì)session進(jìn)行設(shè)置。使用如下:
$name = array( ‘name'=>'name', ‘path'=>'/tmp/', ‘expire'=>0 ); session($name);
這些是在開(kāi)啟session之前進(jìn)行設(shè)置的。在ThinkPHP中定義該函數(shù)的時(shí)候是先判斷$name是否為數(shù)組,如果為數(shù)組的話(huà)就說(shuō)明是在對(duì)session進(jìn)行設(shè)置,然后進(jìn)入相應(yīng)的代碼執(zhí)行設(shè)置。
其實(shí)現(xiàn)代碼如下:
if(is_array($name)) { // session初始化 在session_start 之前調(diào)用 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中,對(duì)于session的存儲(chǔ)系統(tǒng)提供了mysql和memache兩種數(shù)據(jù)庫(kù)。當(dāng)然默認(rèn)情況下是使用文件存儲(chǔ)。判斷session存儲(chǔ)方式的代碼如下:
if(C('SESSION_TYPE')) { // 讀取session驅(qū)動(dòng) $type = C('SESSION_TYPE'); //系統(tǒng)調(diào)用mysql驅(qū)動(dòng)程序 $class = strpos($type,'\\')? $type : 'Think\\Session\\Driver\\'. ucwords(strtolower($type)); $hander = new $class(); //實(shí)例化處理器 //注冊(cè)處理器 session_set_save_handler( array(&$hander,"open"), array(&$hander,"close"), array(&$hander,"read"), array(&$hander,"write"), array(&$hander,"destroy"), array(&$hander,"gc") ); }
對(duì)于session存儲(chǔ)系統(tǒng)的配置是通過(guò)配置選項(xiàng)SESSION_TYPE來(lái)設(shè)置的。
SESSION_TYPE=>'Mysql' //將session存儲(chǔ)在mysql數(shù)據(jù)庫(kù)中
設(shè)置完成以后如果設(shè)置了session自動(dòng)啟動(dòng),那系統(tǒng)會(huì)自動(dòng)開(kāi)啟session
// 啟動(dòng)session if(C('SESSION_AUTO_START')) session_start();
如果想關(guān)閉session自啟動(dòng),對(duì)選項(xiàng)SESSION_AUTO_START設(shè)置如下:
SESSION_AUTO_START => false
如果關(guān)閉了系統(tǒng)自啟動(dòng),可以在項(xiàng)目的公共文件或者在控制器中通過(guò)手動(dòng)調(diào)用session_start()來(lái)開(kāi)啟session?;蛘呤褂煤瘮?shù)session(),其開(kāi)啟方法如下:
session(‘[start]');
在ThinkPHP中其實(shí)現(xiàn)代碼如下:
if('[pause]'==$name){ // 暫停session session_write_close(); }elseif('[start]'==$name){ // 啟動(dòng)session session_start(); }elseif('[destroy]'==$name){ // 銷(xiāo)毀session $_SESSION = array(); session_unset(); session_destroy(); }elseif('[regenerate]'==$name){ // 重新生成id session_regenerate_id(); }
session賦值
session賦值比較簡(jiǎn)單,直接使用:
session('name','onmpw');
除此之外對(duì)于鍵值還可以是多層的中間使用‘.'連接。
session(‘name1.name2','onmpw'); //等價(jià)于 $_SESSION[‘name1'][‘name2'] = ‘onmpw';
在ThinkPHP中對(duì)于session賦值的實(shí)現(xiàn)代碼如下:
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是通過(guò)選項(xiàng)SESSION_PREFIX來(lái)配置的。
session取值
session取值相對(duì)來(lái)說(shuō)也是比較簡(jiǎn)單的。
首先是獲取全部的session,使用方法如下
$values = session();
此時(shí)得到的是一個(gè)數(shù)組。在ThinkPHP中實(shí)現(xiàn)代碼如下:
if(''===$name){ // 獲取全部的session return $prefix ? $_SESSION[$prefix] : $_SESSION; }
再就是取出單個(gè)值
$value1 = session(‘name'); //或者 $value2 = session(‘name1.name2');
其實(shí)現(xiàn)代碼如下:
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,銷(xiāo)毀session和刪除單個(gè)session值。
先說(shuō)清空session。清空session傳參給$name的值為null
session(null); //清空session
其實(shí)現(xiàn)代碼如下:
if(is_null($name)){ // 清空session if($prefix) { unset($_SESSION[$prefix]); }else{ $_SESSION = array(); } }
清空session只是將session對(duì)應(yīng)的文件或者表中的數(shù)據(jù)清除,但是文件還是會(huì)存在的。
銷(xiāo)毀session
session(‘[destroy]');
其ThinkPHP中的實(shí)現(xiàn)代碼如下:
if('[destroy]'==$name){ // 銷(xiāo)毀session $_SESSION = array(); session_unset(); session_destroy(); }
銷(xiāo)毀session和清空session不同的是銷(xiāo)毀session會(huì)將文件一并銷(xiāo)毀。
最后就是刪除單個(gè)session值。使用方式如下
session(‘name',null);
刪除單個(gè)session值,將第二個(gè)參數(shù)$value的值設(shè)為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
最后簡(jiǎn)單介紹對(duì)session的檢查。檢查是指一個(gè)變量是否存在。原生的PHP檢查session變量是這樣檢查的
isset($_SESSION[‘name']);
ThinkPHP封裝之后使用session()函數(shù)是這樣檢查
session(‘?name'); //判斷一個(gè)session是否已經(jīng)設(shè)置
其代碼實(shí)現(xiàn)也是利用了原生的檢查的方式
$name = substr($name,1); if(strpos($name,'.')){ // 支持?jǐn)?shù)組 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]); }
以上幾乎是對(duì)session()函數(shù)各個(gè)功能的使用介紹,以及ThinkPHP是如何實(shí)現(xiàn)的。希望本文的內(nèi)容對(duì)大家在使用ThinkPHP過(guò)程中起到一些幫助作用。
- thinkPHP多域名情況下使用memcache方式共享session數(shù)據(jù)的實(shí)現(xiàn)方法
- thinkphp3.x中session方法的用法分析
- ThinkPHP自定義Redis處理SESSION的實(shí)現(xiàn)方法
- thinkphp中session和cookie無(wú)效的解決方法
- ThinkPHP中Session用法詳解
- thinkphp在模型中自動(dòng)完成session賦值示例代碼
- 如何讓thinkphp在模型中自動(dòng)完成session賦值小教程
- ThinkPHP實(shí)現(xiàn)將SESSION存入MYSQL的方法
- ThinkPHP關(guān)于session的操作方法匯總
- ThinkPHP框架實(shí)現(xiàn)session跨域問(wèn)題的解決方法
- ThinkPHP的模版中調(diào)用session數(shù)據(jù)的方法
- ThinkPHP的cookie和session沖突造成Cookie不能使用的解決方法
- thinkPHP中session()方法用法詳解
相關(guān)文章
實(shí)例講解yii2.0在php命令行中運(yùn)行的步驟
Yii中的資源是和Web頁(yè)面相關(guān)的文件,可為CSS文件,JavaScript文件,圖片或視頻等,資源放在Web可訪問(wèn)的目錄下,直接被Web服務(wù)器調(diào)用。本文通過(guò)實(shí)例講解yii2.0在php命令行中運(yùn)行的步驟,對(duì)yii2.0 php相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2015-12-12Thinkphp 框架基礎(chǔ)之源碼獲取、環(huán)境要求與目錄結(jié)構(gòu)分析
這篇文章主要介紹了Thinkphp 框架基礎(chǔ)之源碼獲取、環(huán)境要求與目錄結(jié)構(gòu),簡(jiǎn)單分析了Thinkphp源碼的獲取方法、下載地址、安裝環(huán)境要求以及目錄結(jié)構(gòu),需要的朋友可以參考下2020-04-04PHP運(yùn)行環(huán)境配置與開(kāi)發(fā)環(huán)境的配置(圖文教程)
本篇文章是對(duì)PHP運(yùn)行環(huán)境配置與開(kāi)發(fā)環(huán)境的配置進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP 二維數(shù)組和三維數(shù)組的過(guò)濾
本文給大家介紹PHP 二維數(shù)組和三維數(shù)組的過(guò)濾,涉及到php三維數(shù)組變二維數(shù)組的相關(guān)知識(shí),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-03-03codeigniter框架The URI you submitted has disallowed characters
這篇文章主要介紹了codeigniter框架The URI you submitted has disallowed characters錯(cuò)誤解決方法,需要的朋友可以參考下2014-05-05thinkphp制作404跳轉(zhuǎn)頁(yè)的簡(jiǎn)單實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇thinkphp制作404跳轉(zhuǎn)頁(yè)的簡(jiǎn)單實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09