区分PHP中的两个会话

区分PHP中的两个会话,php,session,Php,Session,我试着用下面的方法在本地主机上为一个网站编码。说localhost/abc: <?php session_start(); $_SESSION['name']=$row['name'] ?> 产量很好。但是,当同一代码用于同一本地主机上的另一个网页时,请使用localhost/xyz。然后,名字之间出现了歧义。好像我需要区分xyz和abc的会话 所以我试了一下: <?php session_id(226); session_name(veer); session_star

我试着用下面的方法在本地主机上为一个网站编码。说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']);
?>

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

有什么解决办法吗。或者如何区分两个会话。

这是什么

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

有时,我只是在会话密钥前加前缀,而不是执行上述操作 示例:$_会话['xyz_名称]; 当我意识到我的CPanel已经被自己的一些会话使用后,我就这么做了 这引起了我的冲突。

这是什么

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

有时,我只是在会话密钥前加前缀,而不是执行上述操作 示例:$_会话['xyz_名称]; 当我意识到我的CPanel已经被自己的一些会话使用后,我就这么做了
这导致了我的冲突。

来自同一用户代理对同一web服务器的请求将共享同一个会话,除非根据您的确切服务器设置进行显式配置

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

您也可以通过不直接使用
$\u SESSION
来存储数据,而使用基于某些区别因素(如
$\u SESSION['SCRIPT\u NAME']
)的子键,完全在代码中解决此问题。一个非常简单的例子:

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

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

但是,最后一个解决方案确实不雅观,我不推荐。

来自同一个用户代理对同一个web服务器的请求将共享同一个会话,除非根据确切的服务器设置进行显式配置

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

您也可以通过不直接使用
$\u SESSION
来存储数据,而使用基于某些区别因素(如
$\u SESSION['SCRIPT\u NAME']
)的子键,完全在代码中解决此问题。一个非常简单的例子:

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

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

然而,最后一个解决方案确实不雅观,我不推荐。简单地说。。。当您使用同一浏览器实例访问同一web服务器上的两个不同站点时,您正在访问服务器的同一内存区域。因此

http://localhost/xyz
http://localhost/abc
引用的是同一站点的本地主机,因此您不会通过
会话\u start()
启动另一个会话,而是继续它。您也可以像前面所说的那样创建虚拟主机,但是为了进行测试(我想您是这样的),只需使用不同的浏览器即可

另外,您通常不能在不同的机器上共享会话,所以我认为这是您的逻辑错误。或者试试

session_start();
echo (session_id());

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

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

http://localhost/xyz
http://localhost/abc
引用的是同一站点的本地主机,因此您不会通过
会话\u start()
启动另一个会话,而是继续它。您也可以像前面所说的那样创建虚拟主机,但是为了进行测试(我想您是这样的),只需使用不同的浏览器即可

另外,您通常不能在不同的机器上共享会话,所以我认为这是您的逻辑错误。或者试试

session_start();
echo (session_id());

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

使用
session\u regenerate\u id()方法。

使用
会话重新生成\u id()方法。

除非您真的知道自己在做什么,否则不要手动设置会话id。并为两个站点使用唯一的会话名称。这里的第一个答案可能会帮助您避免手动设置会话id,除非您确实知道自己在做什么。并为两个站点使用唯一的会话名称。这里的第一个答案可能会对您有所帮助