session不共享的典型现象是用户登录后刷新页面或跳转路由被重定向到登录页;同一浏览器在不同节点间切换时$_session或$request->getattribute('session')为空;redis中keys session:*仅部分节点有数据。

Session不共享的典型现象是什么
用户登录后刷新页面或跳转路由,突然被重定向到登录页;同一浏览器在不同节点间切换请求时,$_SESSION 或 $request->getAttribute('session') 为空;用 Redis CLI 查 KEYS session:* 发现只有部分节点写入数据。
检查Redis驱动是否真正启用
Hyperf 的 hyperf/session 默认不自动启用 Redis 驱动,即使装了 hyperf/redis 也得手动配对。常见漏点:
-
config/autoload/session.php中'handler'没设成Hyperf\Session\Handler\RedisHandler::class -
'options.connection'值(如'default')和config/autoload/redis.php里定义的连接名不一致 -
redis.php中该连接的host、port、auth配置错误,但没报错——因为 Session 初始化失败时会静默 fallback 到ArrayHandler(内存型,仅本进程有效) - 没确认
RedisHandler构造所需依赖(Hyperf\Redis\RedisFactory)已注入,可通过php bin/hyperf.php di:info Hyperf\Session\Handler\RedisHandler验证
验证Redis key是否跨节点写入
不要只看 PHP 代码逻辑,直接从存储层验证。在任意一台服务器上执行:
redis-cli -h 127.0.0.1 -p 6379 -a your_password KEYS "session:*"
再在另一台节点发起一次登录请求,立刻再查一次。如果两次结果中 session:xxx 的 key 数量没增加,或新增 key 只出现在某一台机器本地 Redis(说明连错了实例),问题就出在连接配置或网络通路上。
注意:session.php 中的 'prefix' 必须所有节点完全一致,否则 A 节点写 session:abc,B 节点读 sess:abc 就永远对不上。
Cookie domain 和 path 是否导致客户端不传ID
Session ID 是靠 Cookie 回传的。多机部署常忽略域名与路径配置:
-
session.php中'cookie_domain'若设为localhost,线上多级域名(如api.example.com/app.example.com)下 Cookie 不会携带 -
'cookie_path'默认是/,但如果 API 部署在子路径(如/v1/),而前端请求发到根路径,Cookie 可能不匹配 - HTTPS 环境下未设
'cookie_secure' => true,浏览器拒绝发送 Cookie;HTTP 环境却设了它,也会丢 ID
用浏览器开发者工具 > Application > Cookies,确认请求头带的 Cookie: 是否含 HYPERF_SESSION_ID=xxx(或你自定义的 cookie_name)。没有,就是前端根本没收到或没传回来。
最易被忽略的是:Hyperf 的 Session 中间件默认不拦截 OPTIONS 预检请求,如果前端跨域登录后立刻发带认证的请求,而预检没带 Cookie,某些网关或 Nginx 配置会误判为未登录。务必确保 Access-Control-Allow-Credentials: true 和对应 Origin 白名单同时生效。











