altmetric / mongo-session-handler
基于MongoDB的PHP会话处理器。
Requires
- php: >= 5.4.0
- ext-mongodb: *
- mongodb/mongodb: ^1.0
- psr/log: ^1.0
Requires (Dev)
- phpunit/phpunit: ^4.8
This package is not auto-updated.
Last update: 2023-05-27 09:52:52 UTC
README
mongo-session-handler不再维护。
Mongo Session Handler 
基于MongoDB的PHP会话处理器。
当前版本 2.1.0
支持的PHP版本 5.4, 5.5, 5.6, 7
注意:此包依赖于MongoDB PHP驱动扩展(mongodb)及其配套的PHP库。如果您需要使用较旧的遗留驱动(mongo),请参阅版本1.0。
安装
$ composer require altmetric/mongo-session-handler:^2.1
用法
<?php use Altmetric\MongoSessionHandler; $sessions = $mongoClient->someDB->sessions; $handler = new MongoSessionHandler($sessions); session_set_save_handler($handler); session_set_cookie_params(0, '/', '.example.com', false, true); session_name('my_session_name'); session_start();
API文档
public MongoSessionHandler::__construct(MongoDB\Collection $collection[, Psr\Log\LoggerInterface $logger])
$handler = new \Altmetric\MongoSessionHandler($client->db->sessions); session_set_save_handler($handler); session_start(); $handler = new \Altmetric\MongoSessionHandler($client->db->sessions, $logger);
使用以下参数实例化一个新的MongoDB会话处理器
$collection:用于会话存储的MongoDB\Collection集合;$logger:一个可选的符合PSR-3的日志记录器。
给定的$collection将使用以下模式填充文档
_id:会话ID的String;data:存储为MongoDB\BSON\Binary对象的会话数据,使用旧通用二进制格式以与较旧版本的此库兼容;last_accessed:表示此会话最后写入时间的MongoDB\BSON\UTCDateTime表示。
此处理器实现了SessionHandlerInterface,意味着它可以注册为会话处理器,使用session_set_save_handler。
会话过期
如果您想使用 SessionHandlerInterface::gc 清理过期的会话,请确保您的 session.gc_divisor、session.gc_probability 和 session.gc_maxlifetime 设置已相应设置,例如,在您的 php.ini 中的以下设置意味着如果一个小时未更新的会话在有人启动新会话时被清理的概率是1%
session.gc_probability = 1 session.gc_divisor = 100 session.gc_maxlifetime = 3600
为了保持会话清理快速,您应该在您的会话 $collection 的 last_accessed 字段上 添加索引,例如:
db.sessions.createIndex({last_accessed: 1});
并发
由于MongoDB 3.0之前不支持 文档级锁定,此会话处理程序基于“最后写入者胜”的原则。
如果一个会话用户造成两个同时写入,则您可能会遇到以下情况:
- 窗口A读取会话值为
['foo' => 'bar']; - 窗口B读取会话值为
['foo' => 'bar']; - 窗口B写入会话值为
['foo' => 'baz']; - 窗口A写入会话值为
['foo' => 'quux']。
会话现在将包含 ['foo' => 'quux'],因为它是最新的成功写入。如果您尝试在会话中增加某个值,这可能会令人惊讶,因为在读取和写入过程中没有锁定
- 窗口A读取会话值为
['count' => 0]; - 窗口B读取会话值为
['count' => 0]; - 窗口B写入会话值为
['count' => 1]; - 窗口A写入会话值为
['count' => 1]。
致谢
- Nick Ilyin 的
php-mongo-session在PHP中为MongoDB支持的会话提供了一个有价值的现有实现。 - 感谢 Josh Ribakoff 提出日志记录器应该是可选的。
许可证
版权所有 © 2015-2017 Altmetric LLP
在MIT许可证下分发。