天天看點

CI中SESSION的用法及其注意

銷毀 Session

要清除目前 session:

$this->session->sess_destroy();

注意: 此函數應該是最後被調用的。即使閃出變量已不再有效。如果你隻想讓某幾項而不是所有項被銷毀,請使用 unset_userdata().

Session 類

注意: Session類并不使用PHP本身的session,而是使用類自己的session,這樣做,可以給開發者提供更大的彈性。

初始化 Session

Sessions會在每個頁面載入後開始運作,是以session類必須首先被初始化。您可以在控制器中初始化,也可以在系統中自動加載(譯者注:在autoload.php設定)。session類的絕大部分都會在背景運作,是以初始化session時,它session資料會被自動讀取、建立和更新。

要在您的控制器構造函數中初始化session類,您可以使用 $this->load->library 函數:

$this->load->library(‘session’);

一旦被載入, session就可以這樣使用: $this->session

Sessions 是怎樣工作的?

當頁面載入後,session類就會檢查使用者的cookie中是否存在有效的session資料。如果session資料不存在(或者已經過期),那麼就會建立一個新的session并把他儲存在cookie中。如果session資料存在,那麼他的資訊就會被更新,同時cookie也會被同時更新。每次更新都會重新生成session_id的值。

對于您來說,需要知道的非常重要的一點就是,session類一旦被初始化,它就會自動運作。對于後面的事情,您可以完全不作理會。正如您将會在下面看到的一樣,您可以正常使用session來工作,甚至還可以添加自己的session資料,而在這一切的過程中,讀、寫和更新的操作都是自動完成的。

Session 資料是什麼?

一個 session 是由一個包括下列資訊的數組組成的:

唯一的使用者Session ID (這是一個平均資訊量統計出來的非常堅固的随機字元串,使用MD5加密,預設是每五分鐘就重新生成一次。

使用者的 IP 位址

使用者浏覽器資訊(取前50個字元)

最新的一個活躍時間戳.

以上資料将會用以下數組格式序列化并存到cookie裡:

[array]

(

‘session_id’ => random hash,

‘ip_address’ => ‘string – user IP address’,

‘user_agent’ => ‘string – user agent data’,

‘last_activity’ => timestamp

)

如果你将加密設定開啟,serialized 的數組會被先被加密,然後存入cookie中。這會讓資料不容易被看到和修改,進而提高安全性。從這裡可以找到更多關于加密的資訊。Session類會自動負責初始化和資料加密。

注意: 預設情況下, Session Cookie 每隔 5 分鐘才會更新一次,這樣會減少對處理器的負荷。如果你重複的裝載頁面, 你會發現”上次活動”的時間在五分鐘,或多餘五分鐘的時候才會變化,也就是 cookie 上次被寫入的時間。 這個時間可以通過設定 system/config/config.php 檔案裡的 $config['time_to_update'] 行來改變。

取得 Session 資料

可以通過如下的函數來得到 session 數組的任何資訊:

$this->session->userdata(‘item’);

item 是數組裡的相對應資料的索引。例如,想要獲得 session ID, 你要使用如下的代碼:

$session_id = $this->session->userdata(‘session_id’);

注意: 如果你的目标資料不存在的話,這個函數會傳回 FALSE (布爾值boolean)。

添加自定義的 Session 資料

session 數組的一個非常有用的用途是你可以它裡面添加你自己的資料,這些資料會被儲存在使用者的 cookie 中。這樣做的原因是什麼呢?看看這個例子:

假設,有個特定使用者登陸到你的網站, 當他通過檢測後 你可以添加他的使用者名和電子郵件到 session cookie 中,這些資訊可以在不去通路資料庫的情況下,當成全局量來使用。

通過以下函數,你可以傳遞一個新的使用者數組到 session 數組中:

$this->session->set_userdata($array);

$array 是一個結合數組,用來存儲你的新資料。例如 :

$newdata = array(

‘username’ => ‘johndoe’,

‘email’ => ‘[email protected]’,

‘logged_in’ => TRUE

);

$this->session->set_userdata($newdata);

如果使用下面 set_userdata()函數的寫法,可以每次隻添加一個使用者資料。

$this->session->set_userdata(‘some_name’, ‘some_value’);

注意: Cookies 隻能存儲 4KB 的資料, 使用時要小心超出它的容量。特别指出的是,加密會産生比原資料更長的資料字元串,是以一定要當心你要存放資料的大小。

删除 Session 資料

正如使用 set_userdata() 是用來添加資訊到 session 中,而通過向 unset_userdata() 函數中傳遞 session key 可以用來删除這些資訊。例如, 你想要從 session 資訊裡去掉 ‘some_name’:

$this->session->unset_userdata(‘some_name’);

也可以給這個函數傳一個要删除項的關聯數組。

$array_items = array(‘username’ => ”, ‘email’ => ”);

$this->session->unset_userdata($array_items);

閃出資料

CodeIgniter 支援 “閃出資料”, 或者說Session資料隻對下次伺服器請求可用, 然後會自動清除。這應該會非常有用,往往應用在資訊或狀态提示中(例如:“記錄2已删除”)。

注意: 閃出資料變量名以“flash_”開頭,是以在你自己的變量名中要避免使用這個字首。

要添加閃出資料:

$this->session->set_flashdata(‘item’, ‘value’);

你也可以使用和 set_flashdata() 同樣的方式向 set_flashdata() 傳遞一個數組。

要讀取一個閃出資料變量:

$this->session->flashdata(‘item’);

如果你發現你需要在一個附加的請求中保留一個閃出資料,你可以使用 keep_flashdata() 這個函數。

$this->session->keep_flashdata(‘item’);

将 Session 資料存入資料庫

由于Session資料數組是附帶一個Session ID儲存在使用者cookie裡的,你無法驗證它,除非你把session資料存儲在資料庫中。在一些不需要或很少需要安全保護的應用中,session ID 或許并不需要。但如果你的應用需要安全保護,驗證是必須滴。

當session 資料在資料庫中可用時,每當從使用者cookie中發現一個有效的session,一個資料庫查詢就會被執行以比對它。如果 session ID 不相配,session 就會被銷毀。Session ID永遠不會更新,它們隻會在一個新的會話建立時生成。

CREATE TABLE IF NOT EXISTS `ci_sessions` (

session_id varchar(40) DEFAULT ’0′ NOT NULL,

ip_address varchar(16) DEFAULT ’0′ NOT NULL,

user_agent varchar(50) NOT NULL,

last_activity int(10) unsigned DEFAULT 0 NOT NULL,

user_data text NOT NULL,

PRIMARY KEY (session_id)

注意: 預設情況下這個表叫做 ci_sessions, 但是你可以給它指定任意名字,隻要你更新了 application/config/config.php 檔案以確定它包含了你所起的名字。一旦你建立了資料表,你就可以像下面這樣在config.php檔案中啟用資料庫選項:

$config['sess_use_database'] = TRUE;

一旦啟用了,Session類就會在資料庫中存儲session資料。

同時確定你已經在配置檔案中指定了資料表名:

$config['sess_table_name'] = ‘ci_sessions”;

注意: Session類已經内置了清除過期session的垃圾回收機制,是以你不需要編寫你自己的事務來做這個。

Session 的參數

你可以在application/config/config.php 檔案中找到以下的 Session 相關的參數:

參數 預設 選項 描述

sess_cookie_name ci_session 無 你想要儲存 Session Cookie 的名字。

sess_expiration 7200 無 session 持續的秒數。預設是2個小時(7200秒)。如果将這個數值設為: 0,就可以得到 永久 session。

sess_encrypt_cookie FALSE TRUE/FALSE (布爾值boolean) 是否對 session 資料加密.

sess_use_database FALSE TRUE/FALSE (布爾值boolean) 是否将 session 資料存放入資料庫中。在開啟這個選項前,你要先建立一個資料庫表。

sess_table_name ci_sessions 任何有效的 SQL 表名 session 資料庫表的名字。

sess_time_to_update 300 時間以秒計算 這個選項控制 session 類多久會産生一個新的session 和 session id。

sess_match_ip FALSE TRUE/FALSE (布爾值boolean) 是否通過使用者的IP位址來讀取 session 的資料。 注意 ,有些網絡運作商 ISPs 會動态的改變IP, 是以将這個選項設為 FALSE, 才有可能得到永久的 session。

sess_match_useragent TRUE TRUE/FALSE (布爾值boolean) 是否要按照對應的 User Agent 來讀取 session 資料。

如何聯系我:【萬裡虎】www.bravetiger.cn

【QQ】3396726884 (咨詢問題100元起,幫助解決問題500元起)

【部落格】http://www.cnblogs.com/kenshinobiy/