php里改写session到memcache里,并实现跨顶级域名的限制(应用单例模式)
这两天研究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"]的生成。
<?php /** * 自定义的session方式,功能是把需要写成session的值存入memcache里,应用单例模式 * by jroam http://www.10np.com * * 用法: * $mss=MySession:init(); $mss->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); } } ?>