pitoncms / session
在不使用原生PHP会话的情况下管理HTTP会话状态
Requires
- php: >=7.3
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();
警告
自行承担使用此会话类的风险。如果您打算将其用于任何安全用途,请阅读代码并理解它所执行的操作。我们对任何问题不承担任何保证。