pitoncms/session

在不使用原生PHP会话的情况下管理HTTP会话状态

2.1.5 2021-09-26 18:38 UTC

This package is auto-updated.

Last update: 2024-09-27 01:08:45 UTC


README

此类维护跨页面视图的会话状态。在cookie中设置一个哈希过的、加盐的会话密钥,该密钥是MySQL表中会话记录的键。会话密钥每5分钟或在配置数组中设置后重新生成。除了密钥外,不存储任何客户端信息。所有用户会话信息都保存在您的数据库中的服务器端。

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

可以在任何时间设置和检索会话数据,可以是键值对,也可以是键值对数组。还支持闪存数据,该数据仅在下一个请求中保持。

安装

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

使用Composer

在composer中要求项目

composer require pitoncms/session

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

"require": {
  "pitoncms/session": "^2.1.4"
}

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

只下载文件

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

创建表

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

用法

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

PDO连接

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

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

定义配置

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

选项

$config['salt'] = 'akjfao8ygoa8hba9707lakusdof87'; // Use your own salt, not this one!
$config['secondsUntilExpiration'] = 1800; // 30 minutes. Can also use 60*60*24 to specify 1 day

// Other configuration options ...

创建会话

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

$Session = new Piton\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();

保存Flash数据

Flash数据仅在下一个请求之前保留,之后将自动删除。

您可以通过使用setFlashData()方法传递字符串、键值对或键值对数组来添加Flash数据。只要可以序列化为JSON,值可以是任何类型。

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

获取Flash数据

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

// 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();

警告

自行承担使用此会话类的风险。如果您打算将其用于任何安全用途,请阅读代码并理解它所执行的操作。我们对任何问题不承担任何保证。