Yii2中Session销毁后仍可读写问题咨询
搞定Yii2 Session销毁后仍可读写的问题
我之前也踩过类似的坑,来给你捋清楚咋回事儿:
为啥会出现这种情况?
你写的代码里,$session->destroy()其实只干了一件事——把服务器上存储的session数据(比如session文件或者数据库里的记录)删掉了,但当前请求中已经加载到内存里的$_SESSION数组还好好待着,所以你接着读写它肯定能行!更坑的是,destroy之后直接写$_SESSION,PHP会自动重新帮你初始化一个session,看起来就像没销毁一样。
正确的销毁姿势
要彻底把session搞死,得按这几步来:
$session = Yii::$app->session; // 第一步:先删掉服务器端的session数据 $session->destroy(); // 第二步:清空当前内存里的$_SESSION数组,断了它的念想 $_SESSION = []; // 第三步:可选操作——把浏览器里的session cookie也清掉,防止下次请求复用 if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } // 现在再测试看看 $m = $session->isActive ? 'ya' : 'no'; echo $m; // 这会儿肯定返回'no'了 $_SESSION['test'] = 1; // 这步已经不生效了 echo isset($_SESSION['test']) ? $_SESSION['test'] : '没设置成'; // 输出'没设置成'
额外提醒
尽量别混着用Yii的Session组件和原生的$_SESSION,统一用$session->get('test')和$session->set('test', 1)来操作,Yii能更好地帮你管理session状态。另外,销毁完session之后最好直接跳转到别的页面,别在当前请求里瞎折腾了,省得残留的内存数据搞出奇怪的问题。
内容的提问来源于stack exchange,提问作者Rezvania
相关产品推荐
相关产品推荐

