monolyth / cesession
Monolyth非框架的替代PHP会话处理程序
Requires
- php: >=7.3
Requires (Dev)
- gentry/gentry: ^0.13.0
- gentry/toast: ^0.1.0
- toast/unit: ^2
README
Monolyth非框架的替代PHP会话处理程序
这是为谁准备的?
虽然PHP支持会话处理,但实现并不完美。Cesession提供了一个替代方案,内置了使用SQL数据库、memcached或NoSQL数据库的帮助器。
Cesession提供了与知名$_SESSION
超全局变量的无缝接口,因此任何现有代码都应该可以正常工作。
使用基于SQL的数据库的一个附加优势是,你可以在当前用户和当前会话之间设置外键约束,这样人们就会自动注销。
安装
Composer(推荐)
$ composer require monolyth/cesession
手动
- 克隆或下载仓库;
- 将
Monolyth\Cesession
命名空间添加到您的自动加载器中,路径为/path/to/cesession/src
。 - 创建相关表(请参阅
./info/sql
中的脚本)
这就完成了!
设置
要开始,请在调用session_start
之前创建Monolyth\Cesession\Session
对象并注册一个处理器。目前Cesession附带了一个Pdo
处理器,它确实如它的名字所暗示的那样(将会话数据存储在PDO兼容的数据库中,例如PostgreSQL或MySQL)
<?php use Monolyth\Cesession\Session; use Monolyth\Cesession\Handler; $session = new Session('my-session-name'); $db = new PDO('dsn', 'user', 'pass'); $handler = new Handler\Pdo($db); $session->registerHandler($handler); session_start();
另外,还有一个Memcached
处理器。由于存储在Memcached中的对象可以随时删除,因此这只能作为与Pdo
等更持久的处理器的后备使用。
数据库表
示例模式包含在./info
目录中。这些包含PDO处理器正常工作所需的最小列;根据您的需要,您可以添加额外的列(例如,为当前登录用户的id添加auth
)。
注册处理器
要注册处理器,只需在$session
对象上调用registerHandler
方法,并传递一个处理器对象。每个处理器对象必须实现Monolyth\Cesession\Handler
接口。这是为了类型提示并确保存在所需的方法。该Handler
接口是PHP内置的SessionHandlerInterface
的子集。
registerHandler
的第二个可选参数是介于0和100之间的概率百分比。这表示对于支持的调用,操作也被委托给下一个处理器(如果定义)的概率。
例如,假设您想将会话存储在Memcached(快速!)中,但平均每十个调用将持久化到PDO后端
<?php $session->registerHandler(new Handler\Memcached($memcached), 10); $session->registerHandler(new Handler\Pdo($db));
注意:目前仅支持Pdo和Memcached处理器。
对所有处理器强制执行操作
有时您可能想确保操作被持久化到所有处理器,例如当用户的身份验证状态更改时。使用force
方法进行此操作。第一个参数是需要调用的会话方法,第二个是需要传递的参数数组
<?php // Force emptying of the current session on all handlers: $session->force( 'write', [session_id(), ['data' => serialize([])] + $session::$session] );
内部,这将以100%的概率在所有定义的处理程序上调用该方法。请注意,使用force
仅在您定义了具有不同概率的多个处理器时才有意义。
转发是在处理器上直接执行的,因此传递的参数与主
Session
对象略有不同。最重要的是,$data
不是作为字符串传递给write
,而是作为包含有关会话的扩展元信息的散列。
编写自己的处理器
请参阅./src/Handler
中的示例。这很简单。
会话编码/解码
默认情况下,Cesession使用session.serialize_handler
PHP ini设置来编码和解码会话数据。您可以通过在php.ini
中修改或在代码中调用ini_set('session.serialize_handler', 'new value')
来覆盖此设置。有关有效值的详细信息,请参阅PHP手册。假设您想使用常规的serialize
和unserialize
调用来存储会话数据,您将这样做
ini_set('session.serialize_handler', 'php_serialize');
这允许您更轻松地从代码中的其他位置(例如,cronjob)修改会话数据,而不必求助于奇怪的方法。