Session失效白屏需主动暴露错误:在config/web.php的session组件中添加EVENT_BEFORE_OPEN监听,检查$event->isValid为false时抛InvalidConfigException,并确保errorHandler启用且YII_DEBUG=true。

Session失效时页面直接白屏或报500,怎么让错误可见
Yii2默认不把session底层失败暴露给前端——比如Redis连接断开、数据库写入超时,session_start()静默失败后,后续代码读$_SESSION为空,可能触发空指针或逻辑错乱,最终抛出无关异常(如Trying to get property 'id' of non-object),根本看不出是session问题。
要让session失效真正“露出来”,得在启动阶段主动拦截并显式报错:
- 在
config/web.php的'session'组件里加'on error'事件监听,捕获yii\web\Session::EVENT_BEFORE_OPEN - 监听函数内检查
$event->isValid,为false时手动抛出yii\base\InvalidConfigException,带明确提示如"Session storage unreachable: Redis connection refused" - 确保
errorHandler组件已启用且YII_DEBUG=true,否则自定义异常会被吞掉,只留空白页
登录态突然丢失,但没报错,怎么确认是session层问题
用户点登录按钮没反应、刷新后变游客、API返回401——这些表象背后,90%不是业务逻辑错,而是session压根没写进去或读不出来。别急着查User模型,先验证session存储层是否真在工作:
- 用
redis-cli连上Redis,执行KEYS yii2session:*(注意keyPrefix要匹配),看有没有以session ID开头的key;没有就说明写入失败 - 登录后立刻在浏览器开发者工具→Application→Cookies里找
PHPSESSID,Domain值必须是.example.com(带前导点),否则子域名拿不到 - 临时注释掉
components['session']配置,让Yii回退到默认FileSession,如果这时能登录成功,基本锁定是Redis/DB配置问题
为什么改了Redis配置,session还是走文件存储
常见错觉:改了'class' => 'yii\redis\Session'就完事了。实际只要漏掉任意一个硬依赖项,Yii就会自动降级回FileSession,且不报任何警告。
使用 Playwright 为 jimeng.jianying.com 管理浏览器会话,导入 cookies/localStorage 以自动化视频生成工作流,支持图片上传等功能
必须同时满足这三点:
-
'redis' => 'redis':这个字符串必须和components里定义的Redis组件名**完全一致**,大小写敏感,不能是'redis://127.0.0.1'这种URL -
'keyPrefix'必须显式设置,哪怕只是'keyPrefix' => '',否则yii\redis\Session构造函数内部会因$this->redis未初始化而跳过连接 - PHP进程必须装了
php-redis扩展(不是predis),运行php -m | grep redis确认输出里有redis
前端fetch请求始终拿不到session,响应头都配了还是401
后端明明存了session,前端fetch调接口却一直401,大概率卡在Cookie传递环节。这不是Yii的问题,是浏览器策略限制:
- fetch必须带
credentials: 'include',缺了这一句,浏览器压根不发PHPSESSIDCookie - 后端响应头
Access-Control-Allow-Origin不能设成*,必须精确匹配前端域名,如https://example.com - 检查
cookieParams里的'secure'是否和当前协议一致:HTTPS站点必须设'secure' => true,否则浏览器拒绝发送带Secure属性的Cookie
这些配置项全对,但某次部署漏改了一个子域名的cookieParams['domain'],问题就会只出现在那个子域,极难复现。










