Session 类別
Session 类別能让你为你的应用程序在無狀態(stateless)的 web 环境下保持狀態。 它能让你在伺服器上使用各種變数解決方案來儲存變数,并且在下个頁面請求再呼叫變数。
配置
Session 是透過 fuel/core/config/session.php 配置档案進行配置。它已经填充了一个預設配置群組。你可以藉由複製此配置档案到你的应用程序 config 目录,并根據需求修改該档案,以覆寫此配置群組并添加新群組。
以下的全域配置值可以被定義:
參数 | 类型 | 預設 | 描述 |
---|---|---|---|
auto_initialize | 布林 |
|
如果为 true,定義在配置中的預設驅动将被自动載入并初始化。 設定为 false 如果你想要手动載入特定 session 配置。 |
driver | 字串 |
|
要載入的 session 驅动名稱。目前你可以使用 'cookie'、'db'、'memcached'、'redis' 和 'file'。 其他值将產生一个错误。 查看進階段落以了解你可以如何手动載入一个 session 驅动,或如何同時使用多个驅动。 |
match_ip | 布林 |
|
如果为 true,儲存在 session cookie 中的 IP 位址将與網頁伺服器所回報的客戶端 IP 位址比對。 在不符合的情況下,該 session 会被丟棄。此函式同時使用客戶端真實 IP 位址及公開 IP 位址, 如此在代理伺服器之後的使用者可以被唯一識別(如果代理透露此資訊)。 |
match_ua | 布林 |
|
如果为 true,儲存在 session cookie 中的 User Agent 字串将與網頁伺服器所回報的 User Agent 字串比對。 在不符合的情況下,該 session 会被丟棄。 |
cookie_domain | 字串 |
|
對 session cookie 有效的網域。如果你留空白,它将預設为指定在 URL 中的 hostname。
確保你遵循 cookie 網域名稱的規則,如 http://www.faqs.org/rfcs/rfc2109.html 所定義的! |
cookie_path | 字串 |
|
如果你希望 cookie 只對某些路徑有效,在这裡輸入該路徑。 你使用它主要是如果你已经安装应用程序在一个文件夾中,而不是在網頁伺服器的 DOCROOT。 |
cookie_http_only | 布林 |
|
如果为 true,只允許透過 HTTP 傳輸 cookie,停用 javascript 存取。 |
expiration_time | 整数 |
|
session 将在之後過期的閒置時間(秒)。这个值必須大於 0。 如果定義一个無效值,它将被設为 7200 秒。 |
expire_on_close | 布林 |
|
當設为 true,session 将在瀏覽器(不是目前視窗!)關閉時過期, 如果設定的話,它会優先於 expiration_time 所定義的。 |
rotation_time | 整数 |
|
为了防止由於 session 固定的 session 劫持,Fuel 自动地加密 session cookie 資料。 它也在指定的時間間隔改變 session IDs。 如果沒給,或定義無效的值,轉动時間預設为 300 秒。 |
flash_id | 字串 |
|
在 session 中的快閃變数透過 flash id 及 session 變数名稱被識別。 你可以使用此 flash id 做为一个 session 變数命名空間,以避免變数名稱碰撞。 或確保來自模組的 session 變数不会與应用程序中使用的變数互相干擾。 |
flash_auto_expire | 布林 |
|
快閃變数的意思是只被用一次。如果你設定此參数为 true,快閃變数将在下一个頁面請求過後自动過期, 無論是否有重讀。 如果你設此为 false,儲存在 session 中的快閃變数将保持,直到你檢索它們。 |
post_cookie_name | 字串 |
|
在沒有 cookie 被傳送到伺服器的情況下(例如,當你使用 Flash 物件),你可以使用客戶端程式码來複製 session cookie 的內容進入一个變数,該變数将被傳送到伺服器做为 POST 請求的一部分。
你可以使用此變数來定義 POST 變数的名稱。
請注意,此變数只在沒找到 session cookie 時被檢查。 |
http_header_name | 字串 |
|
在沒有 cookie 被发送到伺服器的情況下,你也可以使用客戶端程式码來設定一个自訂的
HTTP 表頭來傳遞 session cookie 到伺服器。
注意,此變数将只在找不到 session cookie 時被檢查。 |
enable_cookie | 布林 |
|
當設为 false,沒有 session cookie 会被建立及添加到送回到客戶端的回應。 这意味著,在下一次請求時,你必須用其他方式(GET、POST 或 HTTP-HEADER) 來傳回從客戶端到伺服器的 session-id。 |
native_emulation | 布林 |
|
當設为 true,session 类別会透過 模擬 添加支援 PHP 原生 session。 |
cookie | 陣列 |
|
給以 cookie 为底的 session 特定配置。 |
file | 陣列 |
|
給以 file 为底的 session 特定配置。 |
db | 陣列 |
|
給以 database 为底的 session 特定配置。 |
memcached | 陣列 |
|
給以 memcached 为底的 session 特定配置。 |
redis | 陣列 |
|
給以 redis 为底的 session 特定配置。 |
對於每个 session 儲存驅动來說,存在一个单獨的配置段落。 这个段落包含驅动特定參数, 而且你可以用它來覆蓋特定儲存驅动的全域參数。
Session 类別在以下列表中的位置檢查 session id。它不在此時驗證, 第一个找到的值会被使用,而且如果證明它無效,新的 session 会被建立:
- Post 資料,它会檢查
Input::post
定義在 "post_cookie_name" 中的變数 - Cookie,它会檢查名稱定義在 "cookie_name" 中的有效 cookie。
- Get 資料,它会檢查
Input::get
名稱定義在 "cookie_name" 中的變数。 - http 表頭,它会檢查名稱定義在 "http_header_name" 中的表頭。
session 类別配置與 cookie 类別配置是獨立的。 重要的是你正確地配置 cookie_domain 及 cookie_path 項目。 值得注意的是,'localhost' 網域不被多数现代瀏覽器接受是有效值!
Cookie 驅动配置
cookie 驅动不使用任何伺服器为底的儲存。相反的是,所有 session 變数会被儲存在每个請求之後傳送到瀏覽器的 cookie。只在你不必儲存大量資料時使用,因为一个 cookie 的最大有效負荷大小是 4kb,你将很快地到達,由於陣列序列化的開銷和加密。
特定驅动配置:
參数 | 类型 | 預設 | 描述 |
---|---|---|---|
cookie_name | 字串 |
|
用來儲存 session 的 cookie 名稱。如果沒設定,預設是 'fuelcid'。如果你在应用程序中使用多个 session 驅动,確保每个驅动的 cookie 名稱是唯一的! |
档案驅动配置
特定驅动配置:
參数 | 类型 | 預設 | 描述 |
---|---|---|---|
cookie_name | 字串 |
|
用來儲存 session 的 cookie 名稱。如果沒設定,預設是 'fuelfid'。如果你在应用程序中使用多个 session 驅动,確保每个驅动的 cookie 名稱是唯一的! |
path | 字串 |
|
session 資料被儲存在磁碟上的位置。档案为底的 session 資料为了效能起見不会被加密。確保你選擇一个不能被其他应用程序以及/或使用者讀取的位置。當你在一个共享的主機运行應用程序時,要特別注意这个事實! |
gc_probability | 整数 |
|
要保留控制之下的過期 session 档案数,定期执行垃圾回收。gc_probability 是一个 0 到 100 之間的整数,表示此過程会開始的機会,0 = 從不,100 = 始終。session 驅动执行此任務做为一个 shutdown 事件,以對应用程序的影響降到最低。 |
資料庫驅动配置
特定驅动配置:
參数 | 类型 | 預設 | 描述 |
---|---|---|---|
cookie_name | 字串 |
|
用來儲存 session 的 cookie 名稱。如果沒設定,預設是 'fueldid'。如果你在应用程序中使用多个 session 驅动,確保每个驅动的 cookie 名稱是唯一的! |
database | 字串 |
|
要被用來儲存 session 資料的資料庫名稱。这是定義在应用程序資料庫配置档案 app/config/db.php 中的名稱。如果沒定義,或設定为 null,目前活躍的資料庫会被選擇。
請注意,如果你使用多个資料庫,在这裡使用 null 是不明智的做法,因为你的应用程序流程,在任何所給時間会決定活躍的資料庫。 使用 Config::get('environment') 來使用目前配置的环境,或使用一个具名的資料庫配置。 |
table | 字串 |
|
要被用來儲存 session 資料的資料表名稱。你應該確保此資料表存在,并有这些欄位(MySQL 語法):
CREATE TABLE IF NOT EXISTS `sessions` ( `session_id` varchar(40) NOT NULL, `previous_id` varchar(40) NOT NULL, `user_agent` text NOT NULL, `ip_hash` char(32) NOT NULL DEFAULT '', `created` int(10) unsigned NOT NULL DEFAULT '0', `updated` int(10) unsigned NOT NULL DEFAULT '0', `payload` longtext NOT NULL, PRIMARY KEY (`session_id`), UNIQUE KEY `PREVIOUS` (`previous_id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8; 注意 sessions 資料表在 session_id 及 previous_id 行都有唯一索引。这都是为了加速查詢(始終是透過 ID),并確保沒有重複 ID 被新增。 |
gc_probability | 整数 |
|
要保留控制之下的過期 session 档案数,定期执行垃圾回收。gc_probability 是一个 0 到 100 之間的整数,表示此過程会開始的機会,0 = 從不,100 = 始終。session 驅动执行此任務做为一个 shutdown 事件,以對应用程序的影響降到最低。 |
Memcached session 配置
特定驅动配置:
參数 | 类型 | 預設 | 描述 |
---|---|---|---|
cookie_name | 字串 |
|
用來儲存 session 的 cookie 名稱。如果沒設定,預設是 'fuelmid'。如果你在应用程序中使用多个 session 驅动,確保每个驅动的 cookie 名稱是唯一的! |
servers | 陣列 |
|
包含可用的 memcached 伺服器列表的陣列,如同 http://php.net/manual/en/memcached.addservers.php 所定義。如果你沒指定此參数,它将預設是一个单一 memcached 伺服器,運作在本地機器,并且監聽預設連接埠。 |
Redis session 配置
特定驅动配置:
參数 | 类型 | 預設 | 描述 |
---|---|---|---|
cookie_name | 字串 |
|
用來儲存 session 的 cookie 名稱。如果沒設定,預設是 'fuelrid'。如果你在应用程序中使用多个 session 驅动,確保每个驅动的 cookie 名稱是唯一的! |
database | 字串 |
|
要被用來儲存 session 資料的 redis 資料庫名稱。这是定義在应用程序資料庫配置档案 app/config/db.php 中,redis 段落的名稱。如果沒定義或找不到,'default' 資料庫配置会被選擇。 |
使用 Oil 來建立/控制你的 sessions 資料表
一个 oil 任務提供你能使用 oil 命令列實用工具, 來建立、移除以及清空你的 session 資料表。
# 顯示選单
$ php oil r session
# 建立 sessions 資料表
$ php oil r session:create
# 移除 sessions 資料表
$ php oil r session:remove
# 清空(truncate)sessions 資料表
$ php oil r session:clear
PHP 原生 session 模擬
When activated via the configuration, the Session class will enable some basic emulation of PHP's native session mechanism that can be accessed via the $_SESSION global variable. This only works on the default session instance, the one accessable via the static interface.
When enabled, the Session class will setup a custom session handler, that will capture the calls to the PHP functions session_start(), session_close() and session_write_close(). If will force a close at shutdown when an open native session is detected.
- When session_start() is called, all session data stored in the Fuel session store you have configured will be copied into the $_SESSION array, so it can be accessed by non-Fuel code requiring sessions.
- When the session is closed, a diff is made and changes in $_SESSION are copied back into the Fuel session store.
This mechanism means that if you have a session variable that is modified both inside- and outside Fuel, it is undetermined which of the changes will be saved. This depends on the position of the last session_close() call in the code. If the session is not closed, Fuel's shutdown event will close it, and it will overwrite any data set via standard Session calls!