wolfmoritz/session

此包已被废弃,不再维护。作者建议使用 pitoncms/session 包。

无需原生 PHP 会话管理会话状态

1.2.0 2017-03-25 23:02 UTC

This package is auto-updated.

Last update: 2022-02-01 12:44:09 UTC


README

项目已迁移至 https://github.com/PitonCMS/Session,并在那里进行维护。

PHP 会话处理器

此类负责在页面间维护会话状态。一个经过散列和加盐的会话密钥被设置在 cookie 中,它是 MySQL 表中会话记录的关键。会话密钥每 5 分钟或根据配置数组中的设置进行一次重生成。除了密钥之外,没有其他信息在客户端存储。所有用户会话信息都保存在服务器端的数据库表中。

当会话运行时,会话处理器会寻找与 cookie 密钥匹配的会话记录,如果找到,它会运行可选的检查以验证会话。如果任何检查失败,或者会话已超时,则会销毁会话并开始一个新的会话。

会话数据可以在任何时候作为键值对或键值对数组进行设置和检索。还支持闪存数据,它只持续到下一个请求。

安装

您可以使用 Composer 安装会话处理器,或者直接下载文件到您的项目中。

使用 Composer

在 composer 中要求项目,

composer require wolfmoritz/session

或修改您的 composer.json 项目文件以要求此包,并运行更新或安装。

"require": {
  "wolfmoritz/session": "~1.2.0"
}

这将下载文件并将类注册到 composer 自动加载器中。

或者只需文件

如果您不使用 Composer,请下载此项目并解压。您需要的唯一文件是 src/Session/SessionHandler.php。将此文件放在您的项目中,并确保在启动脚本中包含它。

创建表

您需要使用 SessionTable.sql 脚本在 MySQL 数据库中创建会话表。您可以根据需要更改脚本中的表名,但您需要将表名作为配置项 tableName 提供。

使用方法

要使用会话处理器,请创建 WolfMoritz\Session\SessionHandler 的新实例,传入 PDO 数据库连接和配置数组。

提供 PDO 连接

定义一个新的 PDO 连接并将其作为构造函数的第一个参数传入。

$dsn = 'mysql:host=' . HOST . ';dbname=' . DBNAME;
$dbh = new PDO($dsn, USERNAME, PASSWORD, DB_OPTIONS);

定义配置

定义一个配置数组,只包含您希望更改的选项。唯一必需的配置选项是您应用程序的加密密钥。请使用一个长随机的字符串,并且不要共享它。

选项

选项 默认值 描述
cookieName 'sessionCookie' 您的会话cookie名称。
tableName 'session' 存储您的会话的MySQL表的名称。
secondsUntilExpiration 7200 会话在多少秒后过期。
renewalTime 300 会话密钥在多少秒后重新生成。
expireOnClose false 当浏览器关闭时是否销毁会话,true 或 false。
checkIpAddress false 是否匹配存储的会话的IP地址,true 或 false。
checkUserAgent false 是否匹配存储的会话的User Agent,true 或 false。
secureCookie false 是否设置加密cookie,true 或 false。注意,这仅在使用 https 时有效。
salt none 您的自定义加密密钥。任何长度为16个字符以上的字符字符串。
autoRunSession true 是否自动运行会话,或仅在需要时。
$config['salt'] = 'akjfao8ygoa8hba9707lakusdof87'; // Use your own salt!
$config['secondsUntilExpiration'] = 1800; // 30 minutes
// More configuration options ...

创建会话

将创建一个新的会话作为您应用程序流程的一部分。

$Session = new WolfMoritz\Session\SessionHandler($dbh, $config);

如果将 autoRunSession 设置为 true(默认值),则会话将立即运行并检查有效会话,必要时重新生成会话密钥,并加载任何现有会话数据以供即时检索。创建会话对象一次,或者简单地将它添加到您的依赖注入容器中作为一个单例。

当会话运行时,它将查询数据库。如果您需要使会话类可用但不需要立即运行会话,可以在配置中将 autoRunSession 设置为 false。然后,当您准备好运行会话时,调用 run() 方法。

$Session->run();

保存会话数据

会话运行后,您可以通过传递键值对或键值对数组来使用 setData() 方法添加或更新会话数据。值可以是任何类型,只要它可以序列化为JSON即可。

// Save simple key-value pair
$Session->setData('lupine', 'wolf');

// Save array of key-value pairs
$sessionData = array(
  'feline' => 'cat',
  'canine' => 'dog',
  'lastModified' => 1422592486
);
$Session->setData($sessionData);

提供相同的键将覆盖会话中保存的任何先前值。

获取会话数据

要获取会话数据,请将项目键传递给 getData()。如果没有找到键,则该方法返回 null。要获取所有会话数据,只需不提供参数即可。

// Get one session item
$value = $Session->getData('keyName');

// Get all session items
$values = $Session->getData();

保存闪存数据

您可以通过传递字符串、键值对或键值对数组来使用 setFlashData() 方法添加闪存数据。值可以是任何类型,只要它可以序列化为JSON即可。闪存数据将仅保持到下一个请求,之后将自动删除。

// Save simple key-value pair
$Session->setFlashData('Something went wrong!');
$Session->setFlashData('alert', 'Something went very wrong!');

获取闪存数据

要获取闪存数据,请将项目键传递给 getFlashData()。如果没有找到键,则该方法返回 null。要获取所有闪存数据,只需不提供参数即可。由于闪存数据在下一个请求上自动删除,因此无需显式清除闪存数据。

// Get one flash item
$value = $Session->getFlashData('alert');

// Get all flash items
$values = $Session->getFlashData();

取消设置会话数据

您可以通过传递项目键到unsetData()来删除会话项目,或者不提供参数来删除所有会话数据。

// Delete one session item
$Session->unsetData('keyName');

// Delete all session data
$Session->unsetData();

删除会话

任何未通过验证的会话将自动销毁。但,如果您想删除会话,请调用destroy()方法。

$Session->destroy();

警告

使用此会话类需自行承担风险。阅读代码,并理解其功能,如果您打算用于任何安全用途。对于出现问题,我概不负责。

但如果您有任何改进,请fork此项目并向我发送拉取请求!