Yii1中CHttpSession扩展问题:无法捕获会话销毁事件
解决Yii1中会话销毁事件捕获不生效的问题
嘿,我来帮你排查下这个问题~ 你现在遇到的核心问题是你在控制器里实例化的是原生的CHttpSession类,根本没用到你自己写的SessionDestroy子类,所以重写的destroySession方法完全没被调用,自然看不到日志啦。
我给你一步步梳理解决方案:
1. 配置Yii应用使用自定义Session类
首先要让Yii的整个应用都使用你写的SessionDestroy作为会话组件,打开protected/config/main.php,找到components配置项,添加或修改session的配置:
'components' => array( // ...其他组件配置 'session' => array( 'class' => 'SessionDestroy', // 指定你的自定义Session类 'timeout' => 1440, // 可选,保持你原来的会话超时设置 ), ),
2. 控制器中使用应用的Session实例
不要再手动new CHttpSession了,Yii的组件是单例模式,通过Yii::app()->session获取的才是你配置好的自定义Session实例:
// 获取应用的session组件 $session = Yii::app()->session; $session->open(); // ...你的业务逻辑 $session->destroy();
3. 验证日志配置是否正确
如果还是看不到日志,检查下你的日志配置是否开启了info级别:
'log' => array( 'class' => 'CLogRouter', 'routes' => array( array( 'class' => 'CFileLogRoute', 'levels' => 'info, error, warning', // 确保包含info级别 'logFile' => 'application.log', ), ), ),
额外优化:直接重写destroy方法(可选)
如果你想更直接地捕获destroy操作,也可以直接重写CHttpSession的destroy方法,逻辑会更直观,还能直接添加跳转逻辑:
class SessionDestroy extends CHttpSession { public function destroy($destroySessionId=true) { Yii::log('会话开始销毁', 'info'); $result = parent::destroy($destroySessionId); // 会话销毁成功后跳转首页 if($result) { Yii::app()->controller->redirect(Yii::app()->homeUrl); } return $result; } }
这样修改后,当你调用Yii::app()->session->destroy()时,就能触发日志输出,并且自动跳转到首页啦。
内容的提问来源于stack exchange,提问作者Claudiu
相关产品推荐
相关产品推荐

