tflori/nb-sessions

非阻塞会话变得简单

v2.0.2 2024-01-17 17:28 UTC

This package is auto-updated.

Last update: 2024-09-03 12:40:58 UTC


README

Build Status Coverage Status Latest Stable Version Total Downloads License

PHP的非阻塞会话处理器。这个库受duncan3dc/sessions的启发。

关于非阻塞会话的一些话

默认情况下,PHP中的会话是阻塞的。这是有原因的:为了防止竞态条件。当一个请求开始一个会话(例如,为了验证用户)时,另一个同时请求该会话的请求必须等待直到会话被释放。这样,第一个请求中写入的所有内容都可以在第二个请求中访问。

当创建一个自定义会话处理器(一个处理会话数据的类)时,您可以省略锁定机制,并且一些默认处理器不支持锁定(ini设置session.save_handler)。为什么这不是一个解决方案,而此库是:会话数据仅在会话开始时读取,并在请求结束时写入。

当对同一会话有第二个请求时,它会读取当前状态并写入当前状态。在它写入会话之前,它会通过(重新)启动会话来读取当前数据。当然,还有一个问题:它不会在每次读取之前读取数据。您不应该依赖于数据,例如,计数器可能需要在更新之前刷新会话:$session->counter = $session->refresh()->get('counter', 0) + 1

示例

基本

$session = new \NbSessions\SessionInstance();
$session->set('login', 'jdoe');
$login = $session->login;

命名空间

为了避免键冲突,您可以使用命名空间。

$session->set('foo', 'bar');

$namespace = $session->getNamespace('my-module');
$namespace->set('foo', 'baz');

$session->foo; // 'bar'
$namespace->foo; // 'baz'

静态类

为了更容易访问,您可以使用静态类。但请记住:这更难测试。

$namespace = \NbSessions\Session::getNamespace('my-module');
\NbSessions\Session::get('foo');

设置

通过composer安装并使用时无需配置。

composer require tflori/nb-sessions

选项

这些选项也来自php配置。然而,为了方便,您也可以这样传递

$session = new \NbSessions\SessionInstance([
    'name' => 'PHPSESSID', // defaults to ini_get('session.name')
    'cookie_lifetime' => 0, // in seconds; defaults to ini_get('session.cookie_lifetime')
    'cookie_path' => '/', // ...
    'cookie_domain' => '',
    'cookie_secure' => false, // if you serving via ssl only set this to true
    'cookie_httponly' => false, // we highly recommend this to be true
    'cookie_samesite' => '',
    'destroyEmpty' => true, // when enabled the session gets automatically destroyed once the last element got deleted
]);

提示

此库不会覆盖php的会话配置或注册的会话处理器。它所做的只是处理和强制使用cookie,并在每次更改后写入会话。

在存储或提供cookie并读取元素之前,会话不会启动。这可以防止应用启动对您使用的任何会话处理器的无用请求。

由于此库将处理cookie,您不必担心任何cookie。它会在销毁时删除cookie,并在生命周期不为0时更新cookie(0表示cookie只存储在当前浏览器会话中)。