您好,欢迎访问一九零五行业门户网

php里改写session到memcache里,并兑现跨顶级域名的限制(应用单例模式)

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]的生成。
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); }}?>
其它类似信息

推荐信息