ericmann / sessionz
PHP 会话管理器接口
Requires
- php: >=5.6
- defuse/php-encryption: ^2.0
Requires (Dev)
- phpunit/phpunit: ^5.6
- satooshi/php-coveralls: ^1.0
README
Sessionz 是一个用于模块化应用程序中更智能会话管理的 PHP 库。
快速开始
使用 Composer 将 ericmann/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 框架 所展示的请求中间件堆栈的极大启发。