状态 草稿
Todo Proof and perhaps a full example
官方最后更新时间 2008/12/05 14:36

Session 库

使得程序通过页面保存用户信息状态。

什么是 Sessions?

Sessions(中文也称之为会话)能够为每个用户存储和获得数据请求。通常情况下,因为每个网页(或着 AJAX 请求等)都是个人的请求,这里就没有办法在一个请求设置一个变量并在其他页面得到它的值。Sessions 就是解决这种问题的方法之一。

在有少量的数据需要存在于大部分的网页和数据是针对特定浏览器的会话时 Sessions 就体现的非常有用。例如,如果您的网站有一个“登录”页面,您不妨记住,对于一个具体的网页浏览器,即一个特定的用户已登录。

如果你想在请求中存储更多的数据,它不再是数据仅仅管理一个浏览器会话(Sessions )的问题,其他方法可能更为适合:

默认情况下对于每一个请求 Kohana sessions 会对应 user-agent 进行校验。 虽然提供了一些额外的安全性,这将打破任何一体化的 Flash-server 进入会话,因为 Flash 总是提供自己的 user-agent 字符串而不是嵌入在浏览器中。所以,如果你是在维护 Flash-server 之间的通讯,请在 config/session.php 文件中禁用 user-agent 校验,

开始一个会话(Session)

加载 Session 库并在控制器添加下面的代码或者指定一个控制器方法:

$this->session = Session::instance();

上面的一行代码有两个作用:

  • Session 库会通过 $this→session 激活。
  • 如果当前任何的 session 数据存在,它就会激活。如果没有 session 数据存在,则会自动创建一个新的 session。

使用 sessions

下面的方法均是 Session 库支持的方法:

create()

$this→session→create() 调用创建一个新的 session。它会销毁当前所有的 session 数据。

注意:你不需要调用这个方法来开启 sessions。简单加载 Session 库就可以创建一个新的 session 或者从已存在的 session 获取数据。

id()

$this→session→id() 获取当前 session ID。

例如:

echo '当前 session ID: ' . $this->session->id();

regenerate()

$this→session→regenerate() causes the session ID to be regenerated whilst keeping all the current session data intact.

注意,通过框架对请求的安全检测之后自动完成的。(通过 session.regenerate 设置值)。

destroy()

$this→session→destroy() 销毁所有 session 数据,包括可识别它的浏览器的 cooki。

使用 session 数据

Session 库改写 PHP 内建的 sessions 数组:$_SESSION。这就意味着也可以通过 PHP 的方式获取到 session 数据。

例如:

// 获得 session 数据
data = $_SESSION['fish'];
 
// 设置 session 数据
$_SESSION['fish'] = 5;

此外,Session 库还提供它自己的方法来处理 session 数据:

get()

$this→session→get($key = FALSE, $default = FALSE) 从 session 数据中获取指定名称的值。

  • [mixed] $key session 中指定的数据名。如果 $keyFALSEget() 返回当前 Session 包含的所有数据。
  • [mixed] 如果指定的数据名不存在,$default 为默认值。

例如:

// 返回 foo 的值。如果不存在就返回 'bar'。
$value = $this->session->get('foo','bar');

get_once()

$this→session→get_once($key)get() 类似但在获得当前 session 之后就会删除数据。

例如:

// 从 session 获得 foo 的值并删除 foo。
$value = $this->session->get_once('foo');

set()

$this→session→set($keys, $val = FALSE) 设置数据到当前 Session。

  • [mixed] $keys 既可以是数据名也可以是 key ⇒ value 形式的一对数组。(在这种情况下,$val 参数被忽略)。
  • [mixed] 如果 $keys 是 session 中的数据名,那么 $val 就是其数据值。

例如:

// 设置 some_var 的值为 some_val
$this->session->set('some_var', 'some_value');
 
// 以数组形式设置多个闪存 session 数据
$this->session->set(array('fish' => 5, 'foo' => 'bar'));

delete()

$this→session→delete($keys) 从当前 session 删除指定数据的数据名。

  • [string] $keys 指定数据的数据名,也可以是像一个单独的分段的设置键。

例如:

// 删除 foo
$this->session->delete('foo');
 
// 使用数组的方式删除多个分离开的键
this->session->delete(array('bar', 'bas'));

闪存(Flash)Session 数据

闪存(Flash)Session 数据的数据寿命维持到下一个请求。这样,举个例子,它只能显示一次信息给用户而已。

对于其他的 session 数据,你可以使用 $this→session→get() 获得闪存数据。

set_flash()

$this→session→set_flash($keys, $val = FALSE) 设置闪存数据到当前 Session。

  • [mixed] $keys 既可以是数据名也可以是 key ⇒ value 形式的一对数组。(在这种情况下,$val 参数被忽略)。
  • [mixed] 如果 $keys 是 session 中的数据名,那么 $val 就是其数据值。

实例

// 设置 user_message 闪存 session 数据
$this->session->set_flash('user_message', '你好,最近怎么样?');
 
// 以数组形式设置多个闪存 session 数据
$this->session->set_flash(array('user_message' => '最近怎么样?', 'fish' => 5));

keep_flash()

通常的,闪存数据在下一次请求就会自动删除数据。但有时这个方式并不理想。比方说,下一次请求或许是一些数据的 AJAX 请求,在这种情况下,在上面的例子中你不希望删除 user_message 数据因为它不会通过 AJAX 请求显示给用户。

$this→session→keep_flash($keys) 这个方法可以保持多次的闪存数据请求。(也称为“freshening” 闪存数据)。

  • [string] $keys 指定要保持的闪存数据的变量名。

实例

// 这次请求不删除 user_message
$this->session->keep_flash('user_message');
 
// 不删除 messages 1-3
$this->session->keep_flash('message1', 'message2', 'message3');
 
// 如果你不设置指定的参数,那么所有的闪存数据均会在这次请求之后保持,不被删除。
 
// 不删除任何的删除数据
$this->session->keep_flash();

配置 Session

配置文件:application/config/session.php

/*
 * 文件:Session
 *
 * 选项:
 *  driver         - Session 驱动名:'cookie','database','native' 或 'cache'
 *  storage        - Session 使用驱动(数据库或缓存)的储存参数
 *  name           - 默认 Session 名(仅字母,数字和下划线)
 *  validate       - 设置 Session 参数到变量(user_agent,ip_address)
 *  encryption     - 密钥,设置 FALSE 关闭 session 加密
 *  expiration     - 每个 Session 维持的生命周期(秒)(设置为 0 表示直到退出浏览器才终止 Session)
 *  regenerate     - 一些网页载入前 Session 更新(设置为 0 标志关闭自动更新)
 *  gc_probability - 百分比概率表示垃圾收集将被收集
 */
$config = array
(
	'driver'         => 'cookie',
	'storage'        => '',
	'name'           => 'kohanasession',
	'validate'       => array('user_agent'),
	'encryption'     => FALSE,
	'expiration'     => 7200,
	'regenerate'     => 3,
	'gc_probability' => 2
);

Session 储存方式

默认情况下 Session 数据是以 Cookie 的方式储存。你可以通过修改 config/session.php 文件修改储存方式。

驱动可以在这个文件设置。Session 名和其他的配置项均可以设置。

当前可用的驱动和它们的储存容器:

  • cookie - 使用 Cookie(默认)
  • native - 使用文件
  • database - 使用数据库
  • cache - 使用什么方式(文件,内存,数据库)取决于配置

使用数据库驱动储存 Session

使用数据库驱动储存 Session 需使用数据库和相关表。

默认情况下,Session 库使用默认数据库组中你已经配置的数据库。

默认情况下,Session 库会从表中调用 sessions。(注意!这个架构是之前的版本,详情请下下面)

您可以根据自己的情况配置,首先创建一个表来储存 session。

CREATE TABLE sessions
(
    session_id VARCHAR(127) NOT NULL,
    last_activity INT(10) UNSIGNED NOT NULL,
    data TEXT NOT NULL,
    PRIMARY KEY (session_id)
);

使用数据库储存 session:

$config['driver'] = 'database';
 
$config['storage'] =  array(
     'group' => 'db_group_name', // 或使用 'default'
     'table' => 'session_table_name' // 或使用 'default'
 );

使用缓存驱动

可用的缓存储存容器:

  • APC
  • eAccelerator
  • File
  • Memcache
  • Sqlite
  • Xcache

使用缓存方式储存 session:选择的缓存 储存容器必须正确的配置才可以使用。

缓存配置

 $config['driver'] = 'cache';
 
 $config['storage'] = array(
     'driver' => 'apc',
     'requests' => 10000
 );

永远不需要设置,因为它会在 session 终止之后覆写。

使用本地驱动

本地(Native) PHP session 机制使用时不需要做任何事情就可以工作。

注意:如果你使用的是 Debian/Ubuntu 那么默认储存目录为 /var/lib/php5 且设置 gc_probability 为 0 并让 Debian/Ubuntu 计划任务清理目录。

范例

使用 instance() 方法来检索实例化的 Session 库。如果没有实例化则首先需要创建。

$session=Session::instance();
$var = $session->get('session_item');

Session instance 方法马上会被调用。

$var = Session::instance()->get('session_item');
Session::instance()->set('session_item', 'item value');
libraries/session.txt · 最后更改: 2008/12/06 01:15 由 icyleaf