PHP会话关闭后PHPSESSID仍留存问题咨询
问题解答
该现象是否正常?
该现象属于正常情况。你当前执行的操作仅处理了服务器端的会话数据:重置$_SESSION数组、unset($_SESSION)只会清除当前请求内存中的会话变量,不会主动操作客户端存储的PHPSESSIDCookie。Cookie本身是保存在用户浏览器端的内容,PHP默认不会在清空会话数据时自动删除该Cookie,所以会出现你观察到的输出结果。
同步删除PHPSESSID的实现方法
要彻底销毁会话同时删除客户端的PHPSESSIDCookie,需要按以下步骤执行:
- 调用
session_start()开启当前会话 - 清空
$_SESSION数组内的所有内容 - 主动给客户端返回过期的
PHPSESSIDCookie,需要保证Cookie的路径、域、安全属性、httponly属性和会话初始化时的配置完全一致,否则会出现删除失败的问题 - 最后调用
session_destroy()销毁服务器端对应的会话存储数据
完整示例代码如下:
<?php // 开启会话 session_start(); // 清空所有会话变量 $_SESSION = array(); // 校验当前会话是否通过Cookie存储SESSIONID if (ini_get("session.use_cookies")) { // 获取当前会话Cookie的配置参数 $cookieParams = session_get_cookie_params(); // 设置Cookie过期时间为1小时前,触发客户端自动删除 setcookie(session_name(), '', time() - 3600, $cookieParams["path"], $cookieParams["domain"], $cookieParams["secure"], $cookieParams["httponly"] ); } // 销毁服务器端的会话存储文件/数据 session_destroy(); ?>
执行上述代码后,服务器端会话数据会被完全销毁,客户端的PHPSESSIDCookie也会被同步清除,再次打印$_COOKIE就不会再有对应PHPSESSID的内容。
内容的提问来源于stack exchange,提问作者alessandro
相关产品推荐
相关产品推荐

