abbadon1334 / atk4-session
使用 atk4 数据处理器进行 php 会话处理
Requires
- php: >=7.4 <8.2
- ext-pdo: *
- atk4/data: ~3.1.0
Requires (Dev)
- ergebnis/composer-normalize: ^2.13
- friendsofphp/php-cs-fixer: ^3.0
- guzzlehttp/guzzle: 7.4.1
- johnkary/phpunit-speedtrap: ^3.3
- nikic/fast-route: 1.3.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan: ^1.0
- phpstan/phpstan-deprecation-rules: ^1.0
- phpunit/phpunit: ^9.5.5
- symfony/console: ^4.4.30 || ^5.3.7
- symfony/process: ^5.4
- dev-master
- 3.1.0
- 2.4
- v1.1
- v1.0
- dev-renovate/guzzlehttp-guzzle-7.x
- dev-renovate/phpunit-phpunit-11.x
- dev-renovate/release-drafter-release-drafter-6.x
- dev-renovate/codecov-codecov-action-4.x
- dev-renovate/actions-cache-4.x
- dev-renovate/php-8.x
- dev-renovate/major-symfony
- dev-renovate/actions-checkout-4.x
- dev-renovate/postgres-16.x
- dev-renovate/gvenzl-oracle-xe-21.x
- dev-release/3.1
This package is auto-updated.
Last update: 2024-09-24 13:02:47 UTC
README
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 中,由于异步调用被大量使用,这个问题更为明显。
你可以在不破坏你的项目的情况下添加它,它已经工作,但仍处于开发阶段,需要强有力的审查以确保安全性。