区分 PHP 中的两个会话


Distinguish between two sessions in PHP

我尝试通过本地主机以以下方式为其中一个网站编码。 说本地主机/ABC:

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

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

所以我试了这个:

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

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

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

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

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

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

session_start();
echo (session_id());

在页面顶部,看看您是否正在开始或恢复我认为您没有的相同会话。 我认为您的页面在不同的会话中存储相同的数据,您误认为是同一会话。

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

这个?

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

有时我只是在会话密钥前面加上前缀,而不是执行上述操作示例:$_SESSION["xyz_name"];在我意识到我的 CPanel 已被使用自己的一些会话后,我这样做了这引起了我的冲突。

来自同一用户代理对同一 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';

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