multi-session插件配置文件路径为config/plugin/webman/multi-session/session.php,结构为以路径前缀(如'/admin')为键、session配置数组为值的关联数组,支持前缀匹配,不匹配时回退至config/session.php。

multi-session 插件的配置文件路径和结构
Webman 的多应用 Session 配置必须放在 config/plugin/webman/multi-session/session.php,不能写在 config/session.php 里。这个文件返回一个数组,键是请求路径前缀(必须以 / 开头),值是该路径下生效的 session 配置项。
常见错误是把配置写错位置,或者路径没加斜杠,比如写成 admin 而不是 /admin,导致匹配失败,最终 fallback 到默认配置。
- 路径匹配是「前缀匹配」,
/admin/user和/admin/login都会命中'/admin' => [...] - 不匹配任何路径时,自动回退到
config/session.php中的全局配置 - 所有配置项(如
lifetime、http_only、secure)都和标准 session 配置一致,没有额外字段
中间件顺序问题:为什么 session 在自定义中间件里取不到?
multi-session 插件基于全局中间件实现,且必须在所有其他全局中间件之前执行。如果你在 config/middleware.php 里自定义了中间件,又没调整顺序,那么你的中间件执行时 $request->session() 还没被 multi-session 初始化,会返回空或报错。
正确做法是删掉插件自带的 config/plugin/webman/multi-session/middleware.php,然后在 config/middleware.php 的返回数组最前面插入:
立即学习“PHP免费学习笔记(深入)”;
return [
'' => [
\Webman\MultiSession\Middleware::class,
// 其他中间件...
]
];
注意:'' 是空字符串键,代表全局中间件;\Webman\MultiSession\Middleware::class 必须是第一个元素。
Redis 存储驱动与 multi-session 共存的关键点
multi-session 管理的是「配置」,不是底层存储驱动。你要切换为 Redis,仍需调用 Workerman\Protocols\Http\Session::handlerClass(),但必须在 multi-session 中间件执行前完成注册,否则每个路径分支可能用错 handler。
推荐在 bootstrap.php 或服务启动入口中统一设置:
use Workerman\Protocols\Http\Session; use Workerman\Protocols\Http\Session\RedisSessionHandler; $config = ['host' => '127.0.0.1', 'port' => 6379, 'database' => 1]; Session::handlerClass(RedisSessionHandler::class, $config);
- 不要在每个路径配置里重复设置 handler,那是无效的
- 如果同时用了文件和 Redis,得靠不同插件或自定义 handler 实现,multi-session 本身不支持 per-path 换 handler
-
gc_probability在 Redis 下基本无效,回收由 Redis 过期策略接管
session()->get() 返回 null 却以为数据丢了?检查这三处
明明存了 session,$request->session()->get('key') 却返回 null,大概率不是代码问题,而是环境或配置疏漏:
-
secure设为true但你用的是 http 访问 —— 浏览器不会发送 cookie,后端自然读不到 -
domain配置了具体域名(如'example.com'),但你访问的是localhost或 IP 地址 —— 域名不匹配,cookie 不携带 - 前端发请求时没带 cookie(比如 fetch 默认不带
credentials: 'include'),尤其是跨域或 API 路径下
这类问题不会报错,只会静默失效,调试时建议直接用浏览器开发者工具看 Application → Cookies 里有没有对应 domain/path 的 session cookie,比查代码更快。



















