php session域名共享,实现多域名下共用一个SESSION

本文详细介绍了如何实现多域名间的Session共享,关键在于统一Session数据目录和确保客户端使用相同的SessionID。文章提供了PHP代码示例,演示了通过iframe在不同域名间传递和修改SessionID的方法,适用于Firefox和Chrome,但可能存在IE兼容性问题。
摘要由CSDN通过智能技术生成

要实现多域名共享session,首先就得了解SESSION的运行机制。基本概念我就不说了。

session是这样运行的:

用户A访问站点Y,如果站点Y执行了session_start();(以下假定session_start()总是存在)那么会产生一个 session_id,这个session id一般会以COOKIE的形式保存到用户A(我们可以通过在php.ini里设置session.use_only_cookies为1,强制SESSION ID必须以COOKIE传递。)。这时候SESSION ID表现为$_COOKIE['PHPSESSID'];(PHPSESSID可用session_name()函数来修改)

用户A接着访问,这个session id($_COOKIE['PHPSESSID'])就会在A每次访问Y的时候传送到站点Y。

在站点Y上,会有这么一个目录,是用来保存SESSION的实际数据的。站点Y接收到session id,然后通过session id,来获得与SESSION数据的关联,并返回SESSION数据。

可能聪明的你已经想到了,既然服务器端和客户端之间的SESSION是通过一个SESSION ID来联系,并且SESSION数据是以普通文件的形式保存在一个特定的文件夹里。

那么我们要实现不同域名,只需要满足以下两个条件:

1)不同域名的SESSION数据目录统一到一起,或者同步更新。

2)对同一个客户,使用统一的一个SESSION ID

第一个条件的实现。

如果是同一台服务器,就不需要进行任何设置了。

如果是集群/分布式的,那么我想也不需要我来说了。。能做分布式应用的,在目录共享方面的经验应该比我丰富。我也没有进行过多服务器的测试,主客观条件的原因都有。

我在这里主要是想说一下第二个条件——使不同的域名,拥有统一的SESSION ID。

那我们应该怎么统一呢?

首先必须在不同域名之间传递这个SESSION ID,且由于 cookie必须是针对域名的,所以传递动作是由客户端来完成。如果传递过程不是由客户端来完成,那么接受传递的域名就不知道针对的是哪个客户。

其次就是修改接受传递的域名下的SESSION ID。

如何传递:

HTML里,我们可以使用很多种方法。例如

iframe

或者.js

或者是一个img html元素

%E2%80%9D%22

只要能调用某个地址,就行。

在wml里,由于wml script的特点,我们无法使用script这样的形式来调用,而wml里也没iframe..但是我们还是可以通过img来实现传递的。

如何修改:

既然SESSION ID一般情况下是通过COOKIE来传递,那么我们只需要通过传递$_COOKIE['PHPSESSID'];即可。但是如果PHPSESSID被session_name改变了,我们又得修改setcookie中的PHPSESSID..这样就会变得很麻烦。。所以我们可以选择一个session特有的函数session_id来修改$_COOKIE['PHPSESSID'];

需要注意的几点:

如果session.use_only_cookies为0(PHP默认),那么session id有可能会以url或其他形式传递

session_id()和session_name必须在session_start()前使用

以下是我写的一个简单的实现多域名的类。如果上面的看不太明白,可以看看我的这个多域名类。这个类是在HTML下以iframe形式实现的。

/*

使用:

服务器A,服务器B,在A的index.php登陆,在B里建立一个接收SESSION的文件,例如ses_get.php

A的index.php做如下修改

最开始加上session_start();

而ses_get.php则在开头写上mdSession::_get();

@作者:surfchen@gmail.com http://www.surfchen.org/*/

function mdSession()

{

}function set($urls)

{if (!is_array($urls))

{$urls=array($urls);}foreach ($urls as $value)

{echo '';}return true;}function get()

{session_id($_SERVER['QUERY_STRING']);session_start();return true;}function _set($urls)

{$obj=new mdSession();return $obj->set($urls);}function _get()

{$obj=new mdSession();return $obj->get();}

}?>

index.php :

include "mdSession.php";

session_start();

$_SESSION['php']="yogurt8";

mdSession::_set('http://www.b.com/ses_get.php');

var_dump($_SESSION);

?>

ses_get.php

include "mdSession.php";

mdSession::_get();

?>

b.php :

session_start();

var_dump($_SESSION);

先访问 http://www.a.com/a.php 然后在 http://www.b.com/b.php 看效果

在firefox 与谷歌浏览器是没问题,但在 Ie 下还是不行

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值