Session 类別

Session 类別能让你为你的应用程序在無狀態(stateless)的 web 环境下保持狀態。 它能让你在伺服器上使用各種變数解決方案來儲存變数,并且在下个頁面請求再呼叫變数。

配置

Session 是透過 fuel/core/config/session.php 配置档案進行配置。它已经填充了一个預設配置群組。你可以藉由複製此配置档案到你的应用程序 config 目录,并根據需求修改該档案,以覆寫此配置群組并添加新群組。

以下的全域配置值可以被定義:

參数 类型 預設 描述
auto_initialize 布林
true
如果为 true,定義在配置中的預設驅动将被自动載入并初始化。 設定为 false 如果你想要手动載入特定 session 配置。
driver 字串
'cookie'
要載入的 session 驅动名稱。目前你可以使用 'cookie'、'db'、'memcached'、'redis' 和 'file'。 其他值将產生一个错误。 查看進階段落以了解你可以如何手动載入一个 session 驅动,或如何同時使用多个驅动。
match_ip 布林
false
如果为 true,儲存在 session cookie 中的 IP 位址将與網頁伺服器所回報的客戶端 IP 位址比對。 在不符合的情況下,該 session 会被丟棄。此函式同時使用客戶端真實 IP 位址及公開 IP 位址, 如此在代理伺服器之後的使用者可以被唯一識別(如果代理透露此資訊)。
match_ua 布林
true
如果为 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 布林
false
如果为 true,只允許透過 HTTP 傳輸 cookie,停用 javascript 存取。
expiration_time 整数
7200
session 将在之後過期的閒置時間(秒)。这个值必須大於 0。 如果定義一个無效值,它将被設为 7200 秒。
expire_on_close 布林
false
當設为 true,session 将在瀏覽器(不是目前視窗!)關閉時過期, 如果設定的話,它会優先於 expiration_time 所定義的。
rotation_time 整数
300
为了防止由於 session 固定的 session 劫持,Fuel 自动地加密 session cookie 資料。 它也在指定的時間間隔改變 session IDs。 如果沒給,或定義無效的值,轉动時間預設为 300 秒。
flash_id 字串
'flash'
在 session 中的快閃變数透過 flash id 及 session 變数名稱被識別。 你可以使用此 flash id 做为一个 session 變数命名空間,以避免變数名稱碰撞。 或確保來自模組的 session 變数不会與应用程序中使用的變数互相干擾。
flash_auto_expire 布林
true
快閃變数的意思是只被用一次。如果你設定此參数为 true,快閃變数将在下一个頁面請求過後自动過期, 無論是否有重讀。 如果你設此为 false,儲存在 session 中的快閃變数将保持,直到你檢索它們。
post_cookie_name 字串
''
在沒有 cookie 被傳送到伺服器的情況下(例如,當你使用 Flash 物件),你可以使用客戶端程式码來複製 session cookie 的內容進入一个變数,該變数将被傳送到伺服器做为 POST 請求的一部分。 你可以使用此變数來定義 POST 變数的名稱。
請注意,此變数只在沒找到 session cookie 時被檢查。
http_header_name 字串
'Session-Id'
在沒有 cookie 被发送到伺服器的情況下,你也可以使用客戶端程式码來設定一个自訂的 HTTP 表頭來傳遞 session cookie 到伺服器。
注意,此變数将只在找不到 session cookie 時被檢查。
enable_cookie 布林
true
當設为 false,沒有 session cookie 会被建立及添加到送回到客戶端的回應。 这意味著,在下一次請求時,你必須用其他方式(GET、POST 或 HTTP-HEADER) 來傳回從客戶端到伺服器的 session-id。
native_emulation 布林
false
當設为 true,session 类別会透過 模擬 添加支援 PHP 原生 session。
cookie 陣列
array(
	'cookie_name'    => 'fuelcid',
	'write_on_set'   => true
 )
給以 cookie 为底的 session 特定配置。
file 陣列
array(
	'cookie_name'    => 'fuelfid',
	'path'           => '/tmp',
	'gc_probability' => 5
 )
給以 file 为底的 session 特定配置。
db 陣列
array(
	'cookie_name'    => 'fueldid',
	'database'       => 'development',
	'table'          => 'sessions',
	'gc_probability' => 5
 )
給以 database 为底的 session 特定配置。
memcached 陣列
array(
	'cookie_name'    => 'fuelmid',
	'servers'        => array( 'default' =>
							array(
								'host' => '127.0.0.1',
								'port' => 11211,
								'weight' => 100
							)
						)
 )
給以 memcached 为底的 session 特定配置。
redis 陣列
array(
	'cookie_name'    => 'fuelrid',
	'database'       => 'default'
 )
給以 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_domaincookie_path 項目。 值得注意的是,'localhost' 網域不被多数现代瀏覽器接受是有效值!

cookie 驅动不使用任何伺服器为底的儲存。相反的是,所有 session 變数会被儲存在每个請求之後傳送到瀏覽器的 cookie。只在你不必儲存大量資料時使用,因为一个 cookie 的最大有效負荷大小是 4kb,你将很快地到達,由於陣列序列化的開銷和加密。

特定驅动配置:

參数 类型 預設 描述
cookie_name 字串
'fuelcid'
用來儲存 session 的 cookie 名稱。如果沒設定,預設是 'fuelcid'。如果你在应用程序中使用多个 session 驅动,確保每个驅动的 cookie 名稱是唯一的!
档案驅动配置

特定驅动配置:

參数 类型 預設 描述
cookie_name 字串
'fuelfid'
用來儲存 session 的 cookie 名稱。如果沒設定,預設是 'fuelfid'。如果你在应用程序中使用多个 session 驅动,確保每个驅动的 cookie 名稱是唯一的!
path 字串
'/tmp'
session 資料被儲存在磁碟上的位置。档案为底的 session 資料为了效能起見不会被加密。確保你選擇一个不能被其他应用程序以及/或使用者讀取的位置。當你在一个共享的主機运行應用程序時,要特別注意这个事實!
gc_probability 整数
5
要保留控制之下的過期 session 档案数,定期执行垃圾回收。gc_probability 是一个 0 到 100 之間的整数,表示此過程会開始的機会,0 = 從不,100 = 始終。session 驅动执行此任務做为一个 shutdown 事件,以對应用程序的影響降到最低。
資料庫驅动配置

特定驅动配置:

參数 类型 預設 描述
cookie_name 字串
'fueldid'
用來儲存 session 的 cookie 名稱。如果沒設定,預設是 'fueldid'。如果你在应用程序中使用多个 session 驅动,確保每个驅动的 cookie 名稱是唯一的!
database 字串
null
要被用來儲存 session 資料的資料庫名稱。这是定義在应用程序資料庫配置档案 app/config/db.php 中的名稱。如果沒定義,或設定为 null,目前活躍的資料庫会被選擇。

請注意,如果你使用多个資料庫,在这裡使用 null 是不明智的做法,因为你的应用程序流程,在任何所給時間会決定活躍的資料庫。 使用 Config::get('environment') 來使用目前配置的环境,或使用一个具名的資料庫配置。

table 字串
'sessions'
要被用來儲存 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 整数
5
要保留控制之下的過期 session 档案数,定期执行垃圾回收。gc_probability 是一个 0 到 100 之間的整数,表示此過程会開始的機会,0 = 從不,100 = 始終。session 驅动执行此任務做为一个 shutdown 事件,以對应用程序的影響降到最低。
Memcached session 配置

特定驅动配置:

參数 类型 預設 描述
cookie_name 字串
'fuelmid'
用來儲存 session 的 cookie 名稱。如果沒設定,預設是 'fuelmid'。如果你在应用程序中使用多个 session 驅动,確保每个驅动的 cookie 名稱是唯一的!
servers 陣列
array (
	'default' =>
		array(
			'host' => '127.0.0.1',
			'port' => 11211,
			'weight' => 100
		)
)
包含可用的 memcached 伺服器列表的陣列,如同 http://php.net/manual/en/memcached.addservers.php 所定義。如果你沒指定此參数,它将預設是一个单一 memcached 伺服器,運作在本地機器,并且監聽預設連接埠。
Redis session 配置

特定驅动配置:

參数 类型 預設 描述
cookie_name 字串
'fuelrid'
用來儲存 session 的 cookie 名稱。如果沒設定,預設是 'fuelrid'。如果你在应用程序中使用多个 session 驅动,確保每个驅动的 cookie 名稱是唯一的!
database 字串
'default'
要被用來儲存 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!