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

问题描述:

我有两个基于PHP的应用程序位于同一父目录下。他们都安装了登录机制。我用来存储的会话变量在两个应用程序中都有相同的名称。再说了,为什么一个目录的PHP会话正在影响其他?

$_SESSION["uid"] 

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

我该如何防止这种情况发生?

+0

是两个在'$ _SESSION'数组中使用相同索引名称的应用程序? – Ocracoke

+0

您可以尝试不同的浏览器以保持其他应用程序的会话。 –

+0

如何清除会话变量? –

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

我的建议是一个前缀添加到您的$_SESSION变量,使一个单独的函数用于清除那些前缀$_SESSION变量而不是调用session_destroy();

这可以通过增加你的web应用的session_start();后以下。

对于web应用1:

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

对于web应用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

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

应用2

$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