monolyth / cesession

Monolyth非框架的替代PHP会话处理程序

1.1.9 2022-03-09 14:49 UTC

README

Monolyth非框架的替代PHP会话处理程序

这是为谁准备的?

虽然PHP支持会话处理,但实现并不完美。Cesession提供了一个替代方案,内置了使用SQL数据库、memcached或NoSQL数据库的帮助器。

Cesession提供了与知名$_SESSION超全局变量的无缝接口,因此任何现有代码都应该可以正常工作。

使用基于SQL的数据库的一个附加优势是,你可以在当前用户和当前会话之间设置外键约束,这样人们就会自动注销。

安装

Composer(推荐)

$ composer require monolyth/cesession

手动

  1. 克隆或下载仓库;
  2. Monolyth\Cesession命名空间添加到您的自动加载器中,路径为/path/to/cesession/src
  3. 创建相关表(请参阅./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手册。假设您想使用常规的serializeunserialize调用来存储会话数据,您将这样做

ini_set('session.serialize_handler', 'php_serialize');

这允许您更轻松地从代码中的其他位置(例如,cronjob)修改会话数据,而不必求助于奇怪的方法。