tflori/nb-sessions
非阻塞会话变得简单
Requires
- php: ^7.3 || ^8.0
Requires (Dev)
- ext-curl: *
- mockery/mockery: *
- phpmd/phpmd: *
- phpunit/phpunit: *
- squizlabs/php_codesniffer: *
- tflori/phpunit-printer: *
This package is auto-updated.
Last update: 2024-09-03 12:40:58 UTC
README
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只存储在当前浏览器会话中)。