ericmann/sessionz

PHP 会话管理器接口

0.3.1 2018-01-16 15:06 UTC

This package is auto-updated.

Last update: 2024-08-28 05:20:28 UTC


README

Sessionz 是一个用于模块化应用程序中更智能会话管理的 PHP 库。

快速开始

使用 Composerericmann/sessionz 添加到您的项目中。然后,在加载所有依赖项后,初始化核心会话管理器并将您需要的处理程序添加到堆栈中。

require __DIR__ . '/vendor/autoload.php';

EAMann\Sessionz\Manager::initialize()
    ->addHandler( new \EAMann\Sessionz\Handlers\DefaultHandler() )
    ->addHandler( new \EAMann\Sessionz\Handlers\EncryptionHandler( getenv('session_passkey') ) )
    ->addHandler( new \EAMann\Sessionz\Handlers\MemoryHandler() )

session_start();

以上示例按顺序添加

  • 默认 PHP 会话处理程序(使用文件进行存储)
  • 加密中间件,以便会话数据将在磁盘上静态加密
  • 内存缓存以避免在读取时对文件系统的往返操作

处理程序如何工作

会话管理器维护一个注册的“处理程序”列表,它将这些请求从 PHP 引擎传递到这些处理程序

  • 读取会话
  • 写入会话
  • 创建会话存储
  • 清理(垃圾收集)过期的会话
  • 删除会话

每个处理程序都必须实现 Handler 接口,这样会话管理器就知道如何与它们一起工作。

中间件结构

处理程序堆栈的整体结构与现代 PHP 应用程序中的中间件堆栈相同。您可以在 Slim 的网站上了解更多关于一般哲学的信息

通常,堆栈操作将从外部开始,从最近注册的处理程序开始调用适当的操作,然后向下移动到最老的处理程序。每个处理程序都有选择立即停止执行并返回数据或调用传递的 $next 回调以继续操作的权利。

使用上面的快速开始示例

  • 请求从 MemoryHandler 开始
  • 如有必要,它们会传递到 EncryptionHandler
  • 请求始终从加密传递到 DefaultHandler
  • 如有必要,它们会传递到(隐藏的)BaseHandler
  • 然后一切返回,因为基本处理程序没有传递任何东西

可用的处理程序

DefaultHandler

默认会话处理程序仅将 PHP 的默认会话实现公开给我们的自定义管理器。包括此处理程序将为项目整体提供其他标准的 PHP 会话功能,但可以通过放置其他堆栈在上面来扩展此功能。

EncryptionHandler

存储在磁盘上(默认实现)或单独存储系统(Memcache、MySQL 或类似)中的会话应静态加密。此处理程序将自动在写入时加密通过它的任何信息,并在读取时解密数据。它不会存储数据。

此处理程序在实例化时需要一个对称加密密钥。此密钥应是一个 32 个字节的 ASCII 安全字符串。您可以使用 Defuse PHP Encryption(此库的依赖项)轻松生成新密钥

$rawKey = Defuse\Crypto\Key::createNewRandomKey();
$key = $rawKey->saveToAsciiSafeString();

MemoryHandler

如果最终呈现给会话管理器的最终存储系统是远程的,读取和写入可能需要相当长的时间。将会话数据存储在内存中有助于提高应用程序的性能。如果找到会话,则读取将在堆栈的这一层停止(即缓存是热的),如果没有找到会话,则会流向下一层。如果在后续层中找到会话,此处理程序将更新其缓存以在下次查找时提供数据。

写入将更新缓存并通过堆栈中的下一层传递。

摘要处理程序

默认情况下,BaseHandler 类总是实例化并包含在处理程序堆栈的根目录。这样,无论您在堆栈中添加什么处理程序,会话管理器都会始终返回一组标准、可靠的详细信息。

提供了 NoopHandler 类,供您在标准接口上构建额外的中间件,该接口默认“传递”到堆栈中的下一层。例如,EncryptionHandler 从这个类继承,因为它不存储或读取数据,而只是在对信息进行操作后将其传递。另一种实现可能是日志接口,用于跟踪何时访问/更新会话。

致谢

中间件实现受到了 Slim 框架 所展示的请求中间件堆栈的极大启发。