首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

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

2013-03-12 
php里改写session到memcache里,并实现跨顶级域名的限制(应用单例模式)这两天研究php跨顶级域名问题:终于做

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);    }}?>


热点排行