如何在同一个php脚本中销毁两个不同的会话


How to destroy two different sessions in the same php script?

在会话启动脚本中,我选择session_name,然后执行session_start。

   $session_name = rand(0,1) ? 'first' : 'second';
   session_name($session_name);
   session_start();

上面的代码在每次页面加载时都会运行。在几次页面加载之后,session_name"first"和session_name"second"可能都会有会话。

这是我的注销脚本中的代码,用于尝试销毁这两个会话:

session_start();
session_name("first");
session_unset();
session_destroy();
session_write_close();
session_start();
session_name("second");
session_unset();
session_destroy();
session_write_close();

上面的脚本破坏了第一个,但没有破坏第二个。如果我第二次运行注销脚本,它就会破坏第二个会话,因为第一个会话已经被删除。

如何销毁同一脚本中两个会话名称的会话?

TRY IT

<?php
    session_name("first");
    session_start();
    echo session_status();
    session_destroy();
    echo session_status();
    session_name("second");
    session_start();
    echo session_status();
    session_destroy();
    echo session_status();
?>

我在xampp上测试过它,它返回值2121,这意味着会话是活动的,不存在,会话是活动,不存在。

我把session_name()放在session_start()之前,因为在会话已经启动后,按您的方式设置名称不会生效。我已经在谷歌上搜索过了,它必须对php.ini文件做一些操作,其中session.auto_start被设置为"true"。

关于这一主题的解释和辩论如下:http://php.net/manual/en/function.session-name.php-检查注释。

编辑:

在再次查看您的编辑后,您基本上不会创建两个会话,而是只创建一个会话,它以随机名称"first"或"second"开头。您可以销毁会话,但cookie将保留。我已经在xampp上测试了你的代码,它确实做到了。首先,PHP启动一个会话并存储一个时间值为"session"的cookie,在重新加载页面后,它将再次加载两个选项之一,但这次它将把现有的cookie时间更改为"N/a"。你应该搜索一个解决方案,在页面加载后清除你的域上的cookie,如下所示:

<?php
    $session_name = rand(0,1) ? 'first' : 'second';
    session_name($session_name);
    session_start();
    deleteCookies($session_name);
    function deleteCookies($skip_this_one) {
        if (isset($_SERVER['HTTP_COOKIE'])) {
        $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
        foreach($cookies as $cookie) {
            $parts = explode('=', $cookie);
            $name = trim($parts[0]);
            if ($name == $skip_this_one) {
                //skip
            }else{
                setcookie($name, '', time()-1000);
                setcookie($name, '', time()-1000, '/');
            }
        }
    }
    //do something inside your session
    //when done, stop the session the way you want
    session_destroy();
}
?>

这将删除以前的所有cookie,并保持当前会话的打开状态。

这个解决方案是从这里重写的:如何在php中删除我网站的所有cookie

希望这有帮助:)

请尝试以下代码

<?php unset($_SESSION['name']); // will delete just the name data
session_destroy(); // will delete ALL data associated with that user. 
?>