摧毁旧会话,制作新的,但PHP仍然指旧会话

时间:2013-11-02 02:43:01

标签: php session logout

我花了一些时间才解决这个问题,但确实如此:

我有一个会话。我想彻底杀死我当前的会话,并从头开始,一个全新的会议,有一个空白的名单。

所以这就是我的所作所为:

public function unregister_session()
{
    // I COMMENTED THOSE SECTIONS THAT I WASNT SURE WHAT THEY WERE DOING, BUT PROBLEM PERSISTS.
    //session_regenerate_id();
    //$params = session_get_cookie_params();
        // setcookie(session_name(), '', time() - 42000,
            // $params["path"], $params["domain"],
            // $params["secure"], $params["httponly"]);
    unset($_SESSION);
    $_SESSION=array();
    echo '<br> destroying session. old SID:'.session_id(); //echos 'qqhu7on0n...'
    session_unset();
    session_destroy();
    echo '<br> limbo SID:'.session_id(); //echos nothing.
    session_start();
    echo '<br> new SID:'.session_id();  //echos 'qqhu7on0n...'
}   

好吧,我认为应该发生的是我有一个新的会议。好吧它有点工作,因为关于上一届会议的一切似乎都被遗忘了,至少如果我看一下$_SESSION

但每当我回应session_id时,它仍然会给我一个旧的会话ID!当我将任何值写入$ _SESSION时,它们不会被转移到下一页,而是在下一页$_SESSION为空!

编辑:我在我的脚本上的多个位置回显session_id()(从上到下)我总是显示相同的session_id。进入谷歌开发者工具查看我的cookie,我看到PHPSESSID的不同ID。当我试图在下一页上回应session_id()时,我会看到确切的ID ...

为什么会这样,我做错了什么? 如何让session_id()向我显示新会话ID,而不是旧会话ID? 如何将值写入NEW $ _SESSION变量,以便它们实际转移到下一页?

编辑 - 解决方案

public function unregister_session()
{
    // DUNNO IF THE COMMENTED SECTIONS MAKE A DIFFERENCE
    //$params = session_get_cookie_params();
        // setcookie(session_name(), '', time() - 42000,
            // $params["path"], $params["domain"],
            // $params["secure"], $params["httponly"]);
    unset($_SESSION);
    $_SESSION=array();
    echo '<br> destroying session. old SID:'.session_id(); //echos 'qqhu7on0n...'
    session_unset();
    session_destroy();
    echo '<br> limbo SID:'.session_id(); //echos nothing.
    session_start();
    session_regenerate_id(TRUE); //THIS DOES THE TRICK! Calling it after session_start. Dunno if true makes a difference.
    echo '<br> new SID:'.session_id();  //echos '7b2jn...' :-)
}   

2 个答案:

答案 0 :(得分:1)

结帐,http://php.net/manual/en/function.session-regenerate-id.php

  

session_regenerate_id()

答案 1 :(得分:0)

确保在调用该函数的任何页面上调用session_start。我也会取消注释用于销毁cookie的代码。这可以防止缓存数据的奇怪问题。