altmetric/mongo-session-handler

此包已被废弃且不再维护。未建议任何替代包。

基于MongoDB的PHP会话处理器。

v2.1.0 2017-06-28 12:41 UTC

This package is not auto-updated.

Last update: 2023-05-27 09:52:52 UTC


README

mongo-session-handler不再维护。

Mongo Session Handler Build Status

基于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_divisorsession.gc_probabilitysession.gc_maxlifetime 设置已相应设置,例如,在您的 php.ini 中的以下设置意味着如果一个小时未更新的会话在有人启动新会话时被清理的概率是1%

session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 3600

为了保持会话清理快速,您应该在您的会话 $collectionlast_accessed 字段上 添加索引,例如:

db.sessions.createIndex({last_accessed: 1});

并发

由于MongoDB 3.0之前不支持 文档级锁定,此会话处理程序基于“最后写入者胜”的原则。

如果一个会话用户造成两个同时写入,则您可能会遇到以下情况:

  1. 窗口A读取会话值为 ['foo' => 'bar']
  2. 窗口B读取会话值为 ['foo' => 'bar']
  3. 窗口B写入会话值为 ['foo' => 'baz']
  4. 窗口A写入会话值为 ['foo' => 'quux']

会话现在将包含 ['foo' => 'quux'],因为它是最新的成功写入。如果您尝试在会话中增加某个值,这可能会令人惊讶,因为在读取和写入过程中没有锁定

  1. 窗口A读取会话值为 ['count' => 0]
  2. 窗口B读取会话值为 ['count' => 0]
  3. 窗口B写入会话值为 ['count' => 1]
  4. 窗口A写入会话值为 ['count' => 1]

致谢

许可证

版权所有 © 2015-2017 Altmetric LLP

在MIT许可证下分发。