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

Har*_*ker 6 php

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

   $session_name = rand(0,1) ? 'first' : 'second';
   session_name($session_name);
   session_start();
Run Code Online (Sandbox Code Playgroud)

上面的代码在每个页面加载时运行.加载几页后,可能会有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();
Run Code Online (Sandbox Code Playgroud)

上面的脚本首先破坏但不是第二个.如果我再次运行注销脚本,则会破坏第二个会话,因为第一个会话已被删除.

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

小智 3

尝试一下

<?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();
?>
Run Code Online (Sandbox Code Playgroud)

我在 xampp 上测试了它,它返回值 2121 意味着会话处于活动状态,不存在,会话处于活动状态,不存在。

我将 session_name() 放在 session_start() 之前,因为按照您的方式设置名称在会话启动后不会生效。我用谷歌搜索过它,它必须对 php.ini 文件执行一些操作,其中 session.auto_start 设置为“true”。

关于这个主题的解释和辩论可以在这里找到:http://php.net/manual/en/function.session-name.php - 检查评论。

编辑:

再次检查您的编辑后,您基本上不会创建两个会话,而只会创建一个会话,并且它以随机名称“第一”或“第二”开头。您可以销毁会话,但 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();
}
?>
Run Code Online (Sandbox Code Playgroud)

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

这个解决方案是从这里重写的:how to delete all cookies of my website in php

希望这可以帮助 :)