abbadon1334/atk4-session

使用 atk4 数据处理器进行 php 会话处理


README

License Maintainability Maintainability Technical Debt Test Coverage PHP version

Atk4\Data 的会话处理器 (@see https://github.com/atk4/data)

安装

composer require abbadon1334/atk4-session

初始化 不使用 atk4\ui

// autoload
include '../vendor/autoload.php';

// create pesistence
$db = \Atk4\data\Persistence::connect('mysql://root:password@localhost/atk4');

// init session handler
new \Atk4\ATK4DBSession\SessionHandler($p, [/* session options */]);

使用 atk4\schema 创建会话表

(new \Atk4\Data\Schema\Migrator(new \atk4\ATK4DBSession\SessionModel($p)))->create();

或者

使用 SQL 查询创建会话表

CREATE TABLE `session` (
  `id` bigint() NOT NULL AUTO_INCREMENT,
  `session_id` varbinary(255) DEFAULT NULL,
  `data` blob,
  `created_on` datetime(6) NULL DEFAULT NULL,
  `updated_on` datetime(6) NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `session_id` (`session_id`)
) ENGINE=InnoDB;

会话 GC

如果你使用 InnoDB,删除操作较慢,因此对于大量请求的应用程序,最好的选择是设置一个每 2 分钟运行一次的 cronjob,你可以在 demos/example/cronjob.example.php 中找到一个示例。当你实例化 SessionHandler 时,如果你使用 cronjob,将 gc_probability 选项设置为 0 以禁用 gc 的自动触发。

为什么我需要用这个来替换默认的 PHP 会话处理器?

因为文件锁定(这里有一篇关于这个论点的优秀文章 链接

每个使用会话的调用都会读取一个文件并在其上设置一个锁,直到释放或输出,以防止竞态条件。

显然,在通常静态的事物上使用文件锁定,如现在的会话,是件丢人的事。

使用替代方案时,你肯定会遇到竞态条件,但如果你通常只有 $_SESSION 中的一个 ID,并且从登录到登出几乎是不可变的,那么这种竞态条件会是什么样子呢?

SessionHandler 将替换 PHP 中的 SessionHandler 类,并使用 atk4\data 将会话数据存储在数据库中,而不是使用文件。

在 atk4\ui 中,由于异步调用被大量使用,这个问题更为明显。

你可以在不破坏你的项目的情况下添加它,它已经工作,但仍处于开发阶段,需要强有力的审查以确保安全性。