我有一个注销函数,它在 HTML 渲染之前被调用,它是:
function logout()
{
$_SESSION = [];
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
}
它应该做的是删除 php 会话文件(不会发生)并且客户端 cookie 应该被删除(不会发生)。
我查看了https://www.php.net/manual/en/function.session-destroy.php但我没有看到问题。
我试过了
setcookie(session_name(), '', time() - 42000)
但这也行不通。用 session.use_cookies 注释掉 if 没有帮助。
如果我使用 chrome 检查器工具检查,没有为 cookie 设置过期时间,但 sessionid 与服务器会话文件匹配,因此 cookie 的设置是正确的
如果会话是在不同的页面上设置的,或者设置的顺序不正确,您将无法更改会话数据或销毁会话。我不确定您的具体结构,但执行检查以查看是否有会话,然后在没有会话时设置会话可能是一个不错的起点。
试试这个:
function logout() {
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
}