我正在创建一个新的邮件系统,其中有许多用户登录。
当用户退出并使用session_destroy
时,它还会破坏其他用户的会话,还是session_unset()
更好的选择?我的要求是当用户注销该用户的所有会话时应该销毁。
unset($_SESSION['session_name'])
是更好的选择吗?请建议。
答案 0 :(得分:1)
调用session_destroy
只会破坏当前会话的存储会话数据。它既不删除$_SESSION
中的数据,也不会使当前会话ID无效。
要使某个帐户的所有会话无效,您需要跟踪与该帐户关联的活动会话。例如,您可以使用数据库中的表将会话存储到帐户关联。然后,要使与某个帐户关联的所有会话无效,您需要做的就是遍历所有会话并使其一次无效:
// invalidate current session
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', 1, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
}
session_destroy();
// invalidate other sessions
$sessionIDs = array(/* … */); // IDs of sessions associated to current account
foreach ($sessionIDs as $sessionID) {
session_id($sessionID);
session_start();
$_SESSION = array();
session_destroy();
}
答案 1 :(得分:0)
您说该用户的“其他”会话因此可能意味着您销毁该用户帐户的所有会话,包括可能在其他浏览器中的某些会话,因此服务器上的会话也不同。那是对的吗?
如果你的意思是销毁当前用户的所有活动会话,即使在其他浏览器会话中,那么将会话状态存储在数据库中也是唯一可行的方法。