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!