时间:2021-07-01 10:21:17 帮助过:5人阅读
这两天研究php跨顶级域名问题:终于做了一个勉强(说是勉强,是因为生成$_COOKIE["mzlid"]的值的方法不是完美的)的方案.
首先说一下思路:
session要实现跨顶级域名问题,得解决,程序能识别每一位用户,
在单个域名的时候,是通过sessionid来实现的,sessionid的值的生成原理,是根据客户端的IP,还有其它值,加上时间值,加上随机数,再通过一定规则,最后生成出来并保存在cookie里的。每次请求页面,都把这个值带入header里,这样服务器上的php页面就能识别出不同的用户了。
要跨域,那么这个Id值在访问几个顶级域名产生的值要保持一样。
在这里我的作法是:根据客户的IP,客户的一些其它环境值,生成一个值,并把它存入一个cookie里,那么当客人访问A网站的时间,这个值,生成了,接下来第一次B网站时,这个值没有,如果没有就根据前面的生成规则再生成一次。
那么两个网站在读取$_COOKIE["mzlid"]这个值时,同一个客户,得到的值就是一样的。
接下来我们把它存到memcache里,键名就以这个值为名,内容,以json化数据的形式存进去。
以后这个客人的session的值要增加,修改,删除,都去memcache里查以$_COOKIE["mzlid"]为键名的值,再把它json出来。就OK了。
跨多服务器特点就是利用memcache的集群功能实现.
下面是php操作memcache的session类。
只是省略了$_COOKIE["mzlid"]的生成。
set("host","http://www.10np.com");
$mss->close();
*/
class MySession{
public $memcache;
public $seid;
private static $instance;//存放实例化对像,
private function __construct() {
global $SYS_config;
$this->memcache = memcache_connect($SYS_config["memcachedIP"], $SYS_config["memcacheddk"]);
}
//初始化
function init(){
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
/**
* k值 sessionk值
* $v 内容值
*/
function set($k,$v){
$this->seid=($_COOKIE["mzlid"]);
if($this->seid=="")return "无";
//获取已经存在的值
$a=memcache_get($this->memcache,$this->seid);
if($a) $arr=json_decode($a,true);
$arr[$k]=$v;
$a=json_encode($arr);
$f=memcache_set($this->memcache,$this->seid,$a,MEMCACHE_COMPRESSED,36000);
}
/**
* k值 sessionk值
* $v 内容值
*/
function get($k,$v){
$this->seid=($_COOKIE["mzlid"]);
if($this->seid=="") return "元";
$a=memcache_get($this->memcache,$this->seid);
$arr=json_decode($a,true);
return ($arr[$k])?$arr[$k]:"";
}
/**
* 删除一个值
* 如果$k值为空时,删除这个用户所有的session值
*/
function del($k){
$this->seid=($_COOKIE["mzlid"]);
if($this->seid=="") return "";
if($k==""){
memcache_delete($this->memcache,$this->seid);
return;
}
$a=memcache_get($this->memcache,$this->seid);
$arr=json_decode($a,true);
unset($arr[$k]);
memcache_set($this->memcache,$this->seid,json_encode($arr),MEMCACHE_COMPRESSED,36000);
}
/**
* 关闭memcache的连接
*/
function close(){
memcache_close($this->memcache);
}
// 阻止用户复制对象实例
public function __clone()
{
trigger_error('请不要复制对像.', E_USER_ERROR);
}
}
?>