关于 bitrix-sessions
面向 Bitrix PHP 开发者的会话管理指南,说明主会话、本地会话与内核会话的用途和配置。还涵盖只读及虚拟模式、并发锁和会话安全注意事项。
主要功能
- 01主会话读写与会话 ID 更新
- 02本地会话容器及 TTL 配置
- 03内核会话与分离模式
- 04只读和虚拟会话模式
- 05存储处理器与安全配置
适用场景
- 01保存访客的向导步骤或购物车状态
- 02并行 AJAX 请求中执行只读操作
- 03为令牌认证的 REST 或 webhook 请求使用虚拟会话
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bxmaximum/ bitrix-framework-skills --skill bitrix-sessions安装后在 Claude Code 中输入/bitrix-sessions确认已加载。
详细介绍
会话
基线:main 23.0+ · 已验证:main 26.800.0
切勿使用 $_SESSION:它会绕过延迟启动、只读和虚拟模式。
use Bitrix\Main\Application;
$session = Application::getInstance()->getSession(); // SessionInterface + ArrayAccess
$session->set('vendor.wizard', ['step' => 2]);
$state = $session->get('vendor.wizard'); // null if missing
if ($session->has('vendor.flash')) { $msg = $session->get('vendor.flash'); $session->remove('vendor.flash'); }
$session->regenerateId(); // after login / privilege change
- 键名添加模块 ID 前缀;仅存储标量和数组。
- 后台作业和 Agent 运行前,会话会先写入并关闭:
addBackgroundJob()中的写入会丢失(bitrix-background-jobs)。CLI、Agent 和 Messenger 没有会话。
本地会话 —“会话缓存”
$local = Application::getInstance()->getLocalSession('vendor_cart'); // separate container per name
$local->set('productIds', [1, 2, 3]);
$ids = $local['productIds'] ?? [];
- 数据存储在
cache引擎(Redis/Memcache/APC)中,以会话 ID 为键,并在请求结束时保存;使用文件缓存时,会退回到$_SESSION。 - TTL:
.settings.php'session_local_storage' => ['value' => ['ttl' => 86400]]。 - 适用于购物车、筛选条件、向导草稿:这类数据较大或经常变更,不应让主会话变得臃肿或被锁定。
内核会话
Application::getInstance()->getKernelSession() 保存内核数据(身份验证、sessid)。在 default 模式下,它是主会话;在 separated 模式下,它使用加密 Cookie(crypto_key),且不支持对象。不要在其中存储应用数据。
模式(在 prolog_before.php 之前定义)
define('BX_SECURITY_SESSION_READONLY', true);— 处理程序读取时不加锁,且绝不写入。适用于并行的只读 AJAX(建议、计数器);更改会被丢弃。define('BX_SECURITY_SESSION_VIRTUAL', true);— 使用内存中的会话,不使用 Cookie,也不存储任何内容。适用于使用令牌进行身份验证的 REST/Webhook。define('BX_FORCE_DISABLE_SEPARATED_SESSION_MODE', true);— 强制脚本使用default模式。
session 部分(bitrix-settings)
'session' => [
'value' => [
'mode' => 'separated', // 'default' | 'separated'
'lifetime' => 14400, // kernel cookie lifetime, separated mode only
'handlers' => [
'kernel' => 'encrypted_cookies', // the only allowed kernel handler
'general' => [
'type' => 'redis', // file | database | redis | memcache | null
'host' => '127.0.0.1',
'port' => 6379,
'keyPrefix' => 'site1', // default 'BX'; unique per site sharing a server
],
],
'regenerateIdAfterLogin' => true,
'ignoreSessionStartErrors' => false, // true: hit continues if storage is down
],
'readonly' => true,
],
separated:内核数据存储在 Cookie 中,通用会话会在首次访问时延迟启动——不会触及会话的匿名请求不会访问存储。- Redis/Memcache 的通用会话 TTL 使用
php.ini中的session.gc_maxlifetime,而非lifetime。 - Redis 选项:
host、port、password、servers(集群列表,格式为['host'=>…, 'port'=>…])、serializer、persistent、failover、timeout、readTimeout、keyPrefix、exclusiveLock(锁的值为请求的页面,会显示在锁超时错误中)。Memcache 选项:host、port、servers、connectionTimeout、keyPrefix、exclusiveLock。文件选项:savePath。数据库:表b_user_session(无其他键)。 - 如果没有
session部分,且php.ini中的session.save_handler不等于files,则直接使用 PHP 自带的处理程序。 - 每个可写会话在整个请求期间都会被锁定(Redis/Memcache 最多等待约 60 秒,然后触发致命错误):同一用户的并行 AJAX 请求会串行运行——没有写入内容时请使用
BX_SECURITY_SESSION_READONLY。
安全
- 会话 Cookie 始终启用
HttpOnly;Secure/SameSite由php.ini中的session.cookie_secure/session.cookie_samesite决定。 - 登录和权限变更时重新生成 ID(使用
regenerateIdAfterLogin或regenerateId())。 - 切勿在会话中存储机密信息或完整的用户对象;每次请求都要重新检查权限(
bitrix-security)。
评论
支持 Markdown