如何使用php在同一主机上管理两个不同网站的单独会话状态

时间:2012-10-15 06:28:46

标签: php session-variables session-state session-cookies

我目前正在开发两个网站,并通过连接到localhost进行调试。

第一个网站引用http://localhost/web1,第二个网站引用http://localhost/web2

我为每个创建了一个登录脚本,其中设置了三个特定于域的会话变量,例如:

  1. $_SESSION['web1_user']
  2. $_SESSION['web1_login']
  3. $_SESSION['web1_sessionID']
  4. 但是,当我在相同浏览器上登录两个网站时,请退出一个网站(触发{{1}我也会自动退出第二个网站。

    我非常感谢任何关于如何解决这个问题的想法。 :(

9 个答案:

答案 0 :(得分:9)

啊,共享主机的乐趣! 最好的办法是,只要您实际需要同时登录这两个站点,只需为每个站点使用不同的浏览器......

要解释为什么这很重要,您必须了解以下内容:

Session个变量存储在服务器上,服务器上有一个键控引用,浏览器上有一个cookie。一旦你取消并销毁两者中的任何一个,就不能再进行一场比赛了 - 你的会话就不见了!

session_start();
session_unset();
session_destroy(); 

以上内容将终止将服务器链接到浏览器的所有会话变量(在服务器端)。

轻松管理这种方法的方法是将会话变量转换为另一组数组:

$_SESSION["site1"] = array( $user_id, $session_id );
$_SESSION["site2"] = array( $user_id, $session_id );

你当然可以说它很有趣:

$_SESSION['site3']['userID']    = 'someuserid';
$_SESSION['site3']['sessionid'] = 'somesessionid';

然后当您从网站1退出时

session_start();
unset($_SESSION['site1']);

在这种情况下,您为每个站点创建了一个单独的会话管理系统(使用二维数组,其顶层由您站点的标识符键控)。这样就可以让每个站点管理一组单独的会话变量 - 当你销毁一个会话变量时,你就不会触及其他变量。

但是,我将建议改为使用不同的浏览器(或者另外)......

答案 1 :(得分:3)

我最近解决了与您的问题相关的问题。最初,我正在寻找类似于你所描述的实现,并且经过相当多的搜索 - 这就是我想出的:

网站1

ini_set("session.cookie_domain", "yourdomainname");
$some_name = session_name("some_name");
$domain = 'your domain name';
session_set_cookie_params(0, "/", $domain);
session_start();
$_SESSION['user']=$_POST['user'];
$_SESSION['password']=$_POST['password'];

网站2

$some_name = session_name("some_name");
ini_set('session.cookie_domain', 'yourdomainname');
session_start();
echo $_SESSION['user'];
echo $_SESSION['password'];

这种改变对我来说效果很好 - 我的猜测是它也会帮助你。

答案 2 :(得分:1)

使用

session_name('web1');

之前session_start();

答案 3 :(得分:0)

在每个应用中设置不同的会话名称,via session_name()via session.name

答案 4 :(得分:0)

你可以用这个

ini_set("session.cookie_domain", ".example.com"); 

答案 5 :(得分:0)

您需要为不同的网站制作不同的主机

在这种情况下,您有两个站点在同一主机上运行,​​名为localhost,因此共享相同的主机名会话。

答案 6 :(得分:0)

在第二个域中包含会话开始的文件。

web1包含会话开始文件,web2包含('../ web1 / session.php');

答案 7 :(得分:-1)

您可以在所有网站中使用不同的会话名称,例如您使用的第一个网站$_SESSION['web1_user'], $_SESSION['web1_login'], $_SESSION['web1_sessionID'],然后使用您可以使用的第二个网站$_SESSION['web2_user']

我已经面临这个问题并使用不同的会话名称解决了这个问题。

答案 8 :(得分:-2)

Bez会话在同一个浏览器中共享,因此如果您从一个选项卡注销,其他选项卡将被注销,

示例:我在Chrome中登录,并在另一个Chrome中打开,会话已共享,因此如果我从一个登出,则另一个会自动注销!