当前位置: 首页 > 文档资料 > FuelPHP 中文文档 >

Session 配置 - 类別

优质
小牛编辑
134浏览
2023-12-01

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 驱动配置

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!