两个不同的PHP会话在同一个域中,如何只销毁其中一个?

时间:2015-01-20 08:53:31

标签: php session

在同一个域中我运行了两个应用程序

  • localhost/app1
  • localhost/app2

这是我的会话管理:

页面检查登录信息:

session_start();
//...check if the login is correct

//if is correct
$_SESSION["SESSION_VALID"] = true;
//redirect to the correct page

//if is not correct
$_SESSION["SESSION_VALID"] = false;
//redirect to the login

我的应用程序页面:

//check the session
session_start();
if(!$_SESSION['SESSION_VALID']){
    //redirect to login page
    header("Location: ../../login/");
    exit;
}

退出页面

session_start();
session_unset();
session_destroy();
//redirect to the login
header("Location: ../login/");

现在,回到最初的问题。我已经阅读了与此问题相关的Stack Overflow的几个问题。解决方案是在每session_name("app1")之前使用session_start()

好的,但现在问题是另一个问题:当我从其中一个应用程序注销时,如何设置应该销毁哪个会话?只需在会话销毁前致电session_name("app1")?是正确的解决方案吗?那样的东西?

session_name("name_of_the_session_to_destroy");
session_start();
session_unset();
session_destroy();
header("Location: ../login/");

2 个答案:

答案 0 :(得分:1)

在注销按钮网址中,您可以提供类似?app = 1或?app = 2的GET参数,以便了解要关闭的应用。如果您知道应用程序的会话名称,可以使用以下命令关闭它:

您可以使用unset($_SESSION['SESSION_NAME']);取消设置特定会话。

答案 1 :(得分:1)

您似乎在同一个域上有两个应用程序,但希望完全独立地运行两个会话。您发现注销一个应用程序会将用户从另一个应用程序中删除,但您不希望这种情况发生。

解决方案是将会话cookie设置为仅对每个应用程序的域的目录部分有效。默认情况下,会话扩展到整个域,这就是为什么在一个应用程序中销毁会话也会影响另一个应用程序。

例如,要登录应用1,请在会话开始时执行此操作:

session_set_cookie_params (60 * 30, '/app1');

当然,您需要检测自己所在的应用,并相应地提供正确的路径组件。您可以从$_SERVER变量中获取此信息。

Read more here