ThinkPHP中的session函數的用法

來源:互聯網
上載者:User
這篇文章主要為大家詳細介紹了ThinkPHP中session函數,具有一定的參考價值,感興趣的小夥伴們可以參考一下

在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

// 啟動sessionif(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]);}

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.