欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-05-22 11:09:13
...
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);
    }


}






?>


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

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频