在Safari中删除会话变量会导致错误

时间:2014-06-20 02:05:51

标签: php session session-variables

我在$ _SESSION数组中有三个变量:“views”,“user_id”和“username”。当用户注销时,将删除“user_id”和“username”。这适用于所有浏览器,并且在Safari中大约有75%的时间。有时,它不是删除变量,而是将值“删除”给变量。这会抛弃我的整个网站,因为它取决于变量是否已定义。

我删除变量的代码是:

unset($_SESSION["user_id"]);
unset($_SESSION["username"]);

$_SESSION = array();

session_destroy();

在Safari中,var_dump($_SESSION)给出:

...
["user_id"] => string(7) "deleted"
["username"] => string(7) "deleted"
...

为什么Safari会这样做?

1 个答案:

答案 0 :(得分:1)

Safari与此问题无关。会话在服务器端进行管理,所有Safari(或任何浏览器)都在使用PHPSESSID内的cookie。

您的问题归因于session_destroy。 (强调我的)

  

session_destroy()会销毁与之关联的所有数据   本届会议。 它不会取消设置任何全局变量   与会话相关联,或取消设置会话cookie。 使用   会话变量,必须调用session_start()。

     

为了完全杀死会话,喜欢将用户注销掉,   会话ID也必须取消设置。如果使用cookie来传播   会话ID(默认行为),然后会话cookie必须是   删除。 setcookie()可以用于此。

您的unset()电话应该自行完成。你可以将它们结合起来

unset($_SESSION["user_id"], $_SESSION["username"]);

尝试添加session_write_close();,看看它是否有所作为。

如果失败,请尝试使会话cookie失效

$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
    $params["path"], $params["domain"],
    $params["secure"], $params["httponly"]
);