为什么一个目录的PHP会话正在影响其他目录?

时间:2016-07-26 10:10:28

标签: php

我有两个基于PHP的应用程序,它们位于相同的父目录下。他们都安装了登录机制。我用来存储的会话变量在两个应用程序中都具有相同的名称。说,

$_SESSION["uid"]

现在当我从其中一个应用程序注销时(即基本上清除会话变量),它会自动清除另一个应用程序的会话变量。

如何防止这种情况发生?

2 个答案:

答案 0 :(得分:0)

如果您在PHP中使用session_destroy();,请知道session_destroy();在调用$_SESSION时删除所有变量。即使您的Web应用程序使用两个不同的变量名称,这些变量仍然在$_SESSION中,在调用session_destroy();时丢失。

我的建议是为您的$_SESSION变量添加前缀,并为清除那些带前缀的$_SESSION变量而不是调用session_destroy();

创建单独的函数

这可以通过在您的网络应用session_start();之后添加以下内容来完成。

对于webapp 1:

// Web App 1
define("prefix", "WebApp1");
//SET YOUR SESSION VARIABLES LIKE THIS
$_SESSION[prefix.'authenticated'] = true;

对于webapp 2:

// Web App 2
define("prefix", "WebApp2");
//SET YOUR SESSION VARIABLES LIKE THIS
$_SESSION[prefix.'authenticated'] = true;

然后创建一个单独的函数来销毁我们的前缀会话变量而不是session_destroy();

function destroy_session($prefix){

foreach($_SESSION as $key => $value) {

if(preg_match('/^'.$prefix.'/', $value))
  unset($_SESSION['key']);
  }
}

然后在您的网络应用中调用此功能,而不是session_destroy();

destroy_session(prefix);

答案 1 :(得分:0)

您可以在开始会话之前设置两个应用的会话参数以及设置会话名称。这样,当你结束会话时,它只会影响其中一个。

代码看起来像 - APP1

$sessionName = session_name("appName1");
session_set_cookie_params(0, '/app1', '.domain.com');
session_start();

App2的

$sessionName = session_name("appName2");
session_set_cookie_params(0, '/app2', '.domain.com');
session_start();

有关上述功能的更多信息,请访问以下链接 - http://php.net/manual/en/function.session-name.php http://php.net/manual/en/function.session-set-cookie-params.php