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

在同一个域中有两个不同的PHP会话,如何只销毁其中一个?,php,session,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_VA

在同一个域中,我有两个应用程序正在运行

  • 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/");
我的应用程序的一页:

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/");
注销页面:

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/");

现在,回到最初的问题。我已经阅读了与此问题相关的关于堆栈溢出的几个问题。解决方案是在每次
会话启动()之前使用
会话名称(“app1”)

好的,但现在的问题是另一个:当我从某个应用程序注销时,如何设置应该销毁哪个会话?在销毁会话之前,只需调用会话名称(“app1”)
?正确的解决方案是什么?像这样的

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

在注销按钮url中,您可以提供一个GET参数,如?app=1或?app=2,这样您就知道要关闭哪个应用。如果您知道应用程序的会话名称,可以使用以下命令关闭它:


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

似乎您在同一域上有两个应用程序,但希望完全独立地操作两个会话。您发现注销一个应用会注销另一个应用,但您不希望发生这种情况

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

例如,要登录app 1,请在会话开始时执行以下操作:

session_set_cookie_params (60 * 30, '/app1');
当然,您需要检测您所在的应用程序,并相应地为正确路径组件提供服务。您可以从
$\u服务器
变量中获取此信息


.

由于您正在运行两个应用程序:为了使会话彼此独立,您可以设置会话的cookie有效性以扩展到每个特定子目录。注销另一个应用程序时,您的目的是确保用户不能同时登录两个应用程序吗?那么,如果他们登录到其中一个,他们会自动注销另一个?用户可以同时登录两个会话这不仅仅是会话变量的问题?你这是什么意思?好的,我应该只在checklogin.php页面上设置cookie,对吗?(显然,只有在正确登录的情况下)@WhiteLine:您可以在每页的
session\u start()
之前执行此操作,而不管用户是否正确登录。无论您是否使用此选项,都将设置cookie-这只是指定cookie的一些功能。我插入了此
会话设置cookie参数(60*30,/app1')和这个
会话设置cookie参数(60*30,/app2')位于app2的checklogin.php页面顶部。当前,始终在两个会话中使用变量
SESSION\u VALID
(有问题吗?)。另外,通过设置cookies,当我登录到两个应用程序中的一个时,两个应用程序上的登录都已启用。请尝试清除cookies并重新启动-可能旧cookies处于活动状态。我自己还没有尝试过这个函数,所以可能需要在会话开始后立即调用它?玩一玩,做一点实验。它绝对会工作,这就是该参数的作用。确保所有页面都打开了该代码,包括注销页面。如果cookie值设置不正确,请找出原因。阅读相应手册页面上的注释。这本质上是一个调试问题。