(PHP)如何正确销毁会话cookie?

(PHP)如何正确销毁会话cookie?,php,cookies,session,Php,Cookies,Session,我正在尝试正确地从管理员用户注销。以下是我的功能: function logout() { $_SESSION = array(); //destroy all of the session variables if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 4200

我正在尝试正确地从管理员用户注销。以下是我的功能:

function logout()
{
    $_SESSION = array(); //destroy all of the session variables
    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();
}

基本上,一旦我验证了密码,我就将会话设置为有效(总共只有1个用户)。现在,当管理员点击logout时,我想销毁当前会话,并销毁cookie,这样他们就不能使用浏览器中存储的会话cookie返回到管理员页面。但是我的代码不起作用。我点击注销,我可以直接导航回管理页面。但是,如果我删除我的cookie,功能是完美的。那么,这里的cookie删除功能有什么问题呢?

也许您的问题不在于cookie,而在于浏览器显示了您的管理页面的缓存版本。可能是这样吗?如果当你按F5时它消失了,很可能就是这样。这可以通过设置正确的
缓存控制
标题进行排序


查看如何设置缓存的问题。问题恰恰相反(强制浏览器缓存),但您将知道如何更改以关闭缓存。

如果您真的想覆盖所有基础,请尝试:

setcookie (session_id(), "", time() - 3600);
session_destroy();
session_write_close();

这将阻止PHP执行的其余部分进一步访问会话数据。浏览器可能仍会显示正在设置的cookie,但是$\u会话超级将为空

这只是为在会话cookie过期时遇到问题的其他人提供的提示:


始终使用session_get_cookie_params(),如上面链接中问题的答案所示。

好的,这是有道理的,但是为什么即使在我破坏了会话之后,我仍然可以直接访问管理页面?不管我怎么想,我已经找到了答案-我没有在注销页面上调用session_start()(注销文本链接到一个注销页面,该页面调用我的上述函数)删除cookie仍然是明智的做法,以便通过Varnish等缓存提高匿名内容的可缓存性。如果浏览器持续发送cookie,Varnish将不会缓存响应,即使您为每个访问者生成完全相同的响应。OP的基本概念没有缺陷。他展示了e取消PHP手册中记录的登录会话。@Nilpo确实!编辑了该位。在我看来,您应该在第一行中写入
session\u name()
(等于
PHPSESSID
)。