CodeIgniter 3之Session類庫(2)(轉)

CI3的Session的重大改變就是默認使用了原生的Session,這符合Session類庫原本的意思,彷佛更加合理一些。整體來講,雖然設計理念不一樣,但爲了保證向後兼容性,類庫的使用方法與CI2.0的差異不是很大。通常的使用過程是這樣的:api

寫數據
數組

1 //直接加載默認的files驅動器
2 $this->load->library('session');
3 $this->session->set_userdata('some_name', 'some_value'); //單個數據
4 $newdata = array(
5         'username'  => 'johndoe',
6         'email'     => 'johndoe@some-site.com',
7         'logged_in' => TRUE
8 );
9 $this->session->set_userdata($newdata); // 數組,適合一次保存多個數據的情形。

這跟CI2.0幾乎沒有區別。接下來看讀取Session數據的方法。安全

讀數據
session

1 $name = $_SESSION['name']; // 直接使用,彷佛是官方推薦的方法
2 $name = $this->session->name ; //使用魔術方法,session的名稱name變成了session對象的一個屬性。
3 $name = $this->session->userdata('name'); //與CI2的使用方法同樣,爲保持向後兼容性的一種用法

另一點須要注意,CI3開始,若是返回的數據是空,之前都會置爲 FALSE,如今則會 NULL。 因此之前的寫法:函數

1 $name = $this->session->userdata('name');
2 if($name === FALSE){
3 //……
4 }

須要換成:this

1 $name = $this->session->userdata('name');
2 if($name === NULL){
3 //……
4 }

可使用如下方法判斷是否含有某個名稱的session:spa

1 if($this->session->has_userdata('some_name')){
2 }
3 //或者
4 if(isset($_SESSION['some_name'])){
5 }

刪除數據
設計

刪除的話則和之前相似:api設計

01 unset($_SESSION['some_name']);
02 //或者批量刪除
03 unset(
04         $_SESSION['some_name'],
05         $_SESSION['another_name']
06 );
07 //or
08 $this->session->unset_userdata('some_name');
09 //或者批量刪除
10 $array_items = array('username', 'email');
11 $this->session->unset_userdata($array_items);

整體上看,CI3的Session類庫設計理念是更加接近原生的函數和方法,同時爲了保持向後兼容性,原來的方法也儘可能保留了下來。於此同時,原來的flash data理念作了新的設計,加入了temp data的概念,那麼這兩個data有什麼區別呢?code

flash data  、 temp data 與user data的區別

這三種session數據的名字是CI約定俗成的,指代的內容是不同的,並不存在包含關係。不要錯誤地認爲user data包含flash data或者temp data。在CI的api設計中,分別應用不一樣場景:

1. flash data的主要特徵是:保存的數據是一次性數據,在下次請求中用過一次就沒了。本質上講,flash data跟普通的session數據無異,CI不過是對該類data的名稱作出了特殊標記,保證了它們擁有了只能用一次的特徵,因此你可使用如下方法將 普通的user data標記爲flash data:

1 $_SESSION['item'] = 'value'; //先有一個session
2 $this->session->mark_as_flash('item'); // 單個標記成flash data,item是session的名稱
3 $this->session->mark_as_flash(array('item', 'item2')); //批量標記
4 //或者一次性的標記,再也不是先有session,再標記成flash data的過程
5 $this->session->set_flashdata('item', 'value');

flash data的適用場景是:將操做結果返回到下一次請求的頁面上。好比有個保存操做,提交後會跳轉到一個新的頁面,你可使用flash data保存一句話「保存已成功」,該句話只在跳轉的頁面顯示一次,再次刷新跳轉頁面,就不會顯示了。

2. temp data的主要特徵是: 保存的數據在規定的時間內有效,它的生命期由方法$this->session->set_tempdata('item', 'value', 300)設置,其中的300意思是該session數據的有效期爲5分鐘,超過規定時間(即使是session還沒過時)就會失效,它的時效性介於 flash data 和user data 之間。它和flash data在本質上是相似的,也能夠從普通的session轉化過來:

01 $_SESSION['item'] = 'value';
02 $this->session->mark_as_temp('item', 300); //標記item的生命期只有300s
03 $this->session->mark_as_temp(array('item', 'item2'), 300); //批量將生命期標記爲300s
04 //分別標記成不一樣的生命期
05 $this->session->mark_as_temp(array(
06         'item'  => 300,
07         'item2' => 240
08 ));
09  
10 $this->session->set_tempdata('item', 'value', 300);//直接設置一個temp data,經常使用方法

temp data的適用場景是:保存一些更加細粒度的、更加隱私的session數據。好比某些令牌token,比較重要,爲了安全讓它的生命期更短一些,能夠保證安全。temp data的設計從某種方面保證了session擁有不一樣生命期的數據。

3. user data的主要特徵是:保存的數據在session有效期內均有效,它的生命期由sess_expiration設置,通常默認是7200s,並且它也是生命期最長的。

flash data  、 temp data 與user data的讀取

CI Session類中的flash data、temp data與user data,都能以$_SESSION['item'] 的方式獲取到。同時又可以使用各自的方法獲取到:

01 echo $_SESSION['item']; //三種類型的數據都能獲得
02  
03 $this->session->flashdata('item'); // 獲取flash data
04 $this->session->flashdata(); //獲取所有flash data
05  
06 $this->session->tempdata('item'); //獲取temp data
07 $this->session->tempdata(); //獲取所有temp data
08  
09 $this->session->userdata('item'); // 獲取user data
10 $this->session->userdata(); //獲取所有user data

可是要注意:這幾種數據是分割開來的,不能使用$this->session->userdata('item'),去訪問一個設爲flash data的數據:

1 $this->session->set_tempdata('item', 'value', 300);
2 $this->session->userdata('item'); //將會返回null
3  
4 $this->session->set_flashdata('item2', 'value');
5 $this->session->userdata('item2'); //將會返回null

Session數據的刪除與銷燬

session數據的刪除能夠理解爲細粒度的刪除某個session數據,可使用:

1 $this->session->unset_userdata('item'); //刪除user data
2 $this->session->unset_tempdata('item'); //刪除temp data
3  
4 unset($_SESSION['item']); //對flash、temp、user三種data都有效,原生方法,推薦。

session銷燬,則會使全部數據類型失效,包括flash data 和temp data:

1 session_destroy(); //原生,推薦
2 // 或者
3 $this->session->sess_destroy();

擴展內容:flash、temp及user data的設計思路

首先,三種類型的數據一定存在了$_SESSION超級變量中,也就是說使用set_tempdata()和set_flashdata()方法,都會把 對應的名稱加入到$_SESSION超級變量中。不過這還沒完,CI會用一個叫__ci_vars的session數據來區分flash 、temp與user data的不一樣。

1 $_SESSION['__ci_vars'] = array();

使用set_flashdata('item', 'value')時,除了$_SESSION['item'] = 'value'; 同時會有:

1 //仍是首先會被保存到超級變量中
2 $_SESSION['item'] = 'value';
3 //而後保存到__ci_vars的session中
4 //  session值‘new’是CI本身定義的,沒特殊含義,能夠當作是flash data的標記
5 $_SESSION['__ci_vars']['item'] = 'new';

而使用set_tempdata('item2', 'value', 300)時,也是相似,不過略有區別:

1 //仍是首先會被保存到超級變量中
2 $_SESSION['item2'] = 'value';
3 //而後保存到__ci_vars的session中
4 // 13789020340是當前時間戳加上300s, time() + 300;
5 //300來自於過時時間設置,能夠在方法中傳入
6 $_SESSION['__ci_vars']['item2'] = 13789020340;

當使用這些不一樣類型的數據時,CI首先看$_SESSION是否含有這個key,而後會根據$_SESSION['__ci_vars']數據包中key 對應的值來判斷,簡單地說,就是看對應的值是否是int類型。若是是,就認爲是temp data;若是不是,則認爲是flash data。因此,你可使用$_SESSION()方法得到全部類型的數據,也可使用unset方法,刪除掉全部類型的數據。

設置完flash data和temp data的下次請求時,構造函數都會判斷$_SESSION['__ci_vars']中的特定數據,若是值爲‘new’的,則置爲‘old’;若是值是數字,則跟當前的時間戳比較,小於的話,則會刪除該key下的數據。

再次請求時,flash data中置爲‘old’的數據自動被刪除,沒法再次讀取,temp data中的key已通過期刪除,取值爲NULL。

相關文章
相關標籤/搜索