在session_destroy之后php不会丢失会话数据

时间:2013-05-31 09:03:40

标签: php session-cookies

我正在尝试在php中使用会话而不是很远。我的所有php页面都是通过ajax从一个“门户页面”调用的。我使用会话在ajax调用之间存储信息。我有一个包含文件,它是每个ajax页面中的第一个文件,它将session_start作为第一个方法调用。会话数据似乎保存好了。但是当我在用户注销页面上完成它时,我遇到了摆脱会话的问题。 注销页面是一个ajax页面,它基本上是这样做的:

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"]);
    }
//code to unset session variables
        session_destroy();

如果我尝试在注销页面上将会话变量写入屏幕,那么它就像你期望的那样是空的。但是,如果我刷新门户网站页面并将session_id显示到屏幕,则它与上一个会话中的ID相同,该ID会被破坏。如果我关闭浏览器并再次打开它我会有一个新的会话

在调用注销页面后,php会话cookie仍在浏览器cookie中。页面刷新自然会加载此cookie。为什么不删除cookie?我的代码是否有问题,或者它是否与ajax页面有关?

2 个答案:

答案 0 :(得分:0)

删除cookie时,cookie删除将发生在请求浏览器删除cookie的请求中。但在该请求期间,cookie仍然存在。因此,要查看删除cookie的调用中仍存在的cookie是预期的行为。

因此在注销期间/之后,cookie仍然存在。只有在清除cookie的请求之后,cookie才会被移除1个请求。

如果在注销后cookie仍然存在于多个请求中,请尝试将cookie的时差从42000增加到(11小时)到90000(25小时)。也许你和客户之间存在时区差异

答案 1 :(得分:0)

只要在任何页面上都有函数 session_start()的实例,浏览器通常都会在客户端计算机上创建并维护会话cookie,cookie名称。在关闭浏览器或网页或在服务器上调用session_regenerate_id()之前,会话ID将保持不变。

我猜想注销页面上可能有一个session_start()实例,这就是为什么您在浏览器cookie部分中不断看到会话cookie的原因。不过,您不必担心,因为您已经删除了服务器端使用session_destroy()存储在该“会话Cookie ID”上的所有关联数据,您在浏览器Cookie部分中看到的会话Cookie名称只是一个虚拟会话ID,等待您何时开始在服务器上再次存储会话数据。

如果您不想看到通常以PHPSESSID〜开头的会话cookie ID,则应确保注销页面上没有对session_start()的调用,但我必须说这没有意义。

希望有帮助。