在PHP中区分两个会话

时间:2012-05-24 10:11:21

标签: php session

我尝试使用以下方式为本地主机上的某个网站编码。比如localhost / abc:

<?php
session_start();
$_SESSION['name']=$row['name']
?>

输出很好。但是当同一个代码用于同一个本地主机上的另一个网页时,请说localhost / xyz。然后名字之间存在歧义。好像我需要区分xyz和abc的会话。

所以我尝试了这个:

<?php
session_id(226);
session_name(veer);
session_start();
.
.
.//connection with database and all
.
$_SESSION['name']=$row['name'];
echo($_SESSION['name']);
?>

当另一台计算机通过同一台服务器登录时,我创建的会话可由该计算机访问同一网页。

有没有解决方案。或者如何区分两个会话。?

4 个答案:

答案 0 :(得分:3)

简单来说......当您使用相同的浏览器实例访问同一Web服务器上的两个不同站点时,您正在访问服务器的相同内存区域。因此

http://localhost/xyzhttp://localhost/abc指的是同一个站点localhost,因此您不会通过session_start()启动另一个会话,而是恢复它。您也可以创建Jon所说的虚拟主机,但为了测试我猜你的用途,只需使用不同的浏览器。

此外,您无法正常在不同的计算机上共享会话,因此我认为这是您的逻辑错误。或者尝试

session_start();
echo (session_id());
在页面顶部

,看看你是否正在开始或恢复我认为你不是的同一个会话。我认为你的页面在不同的会话中存储相同的数据,你被误认为是同一个会话。

答案 1 :(得分:1)

在第二个文件(xyz)中使用session_regenerate_id();方法。

答案 2 :(得分:0)

此?

<?php
session_start();
if (!isset($_SESSION['xyz'])) { $_SESSION['xyz'] = array(); }
$_SESSION['xyz']['name'] = $row['name'];
?>

有时候我不会做上面的事情而只是我的会话密钥的前缀 例如:$ _SESSION ['xyz_name']; 在我意识到我的CPanel已经使用了一些自己的会话后,我就这样做了 这引起了我的冲突。

答案 3 :(得分:0)

从同一个用户代理到同一个Web服务器的请求将共享同一个会话,禁止显式配置,具体取决于您的确切服务器设置。

通常这个问题是可以避免的,因为“其他网页”实际上完全在另一个域上,因此会话cookie(以及扩展会话数据)将不会被共享。如果您想在localhost上独立运行单独的应用程序,也应该这样做:在不同的内部域上设置单独的虚拟主机。

您也可以完全在代码中解决问题,方法是不直接使用$_SESSION存储数据,而是使用基于某些差异因素的子键,例如$_SESSION['SCRIPT_NAME']。一个非常简单的例子:

$sessionKey = "default";
if (strpos($_SESSION['SCRIPT_NAME'], "dir1/")) {
    $sessionKey = "dir1";
}
else if (strpos($_SESSION['SCRIPT_NAME'], "dir2/")) {
    $sessionKey = "dir2";
}

$_SESSION[$sessionKey]['mydata'] = 'foo';

然而,最后一个是一个非常不优雅的解决方案,我不建议。