使用memcached处理Session信息
1、用数据库来同步Session会加大数据库的负担,因为数据库本来就是容易产生瓶颈的地方,但如果采用MemCache来处理Session是非常合适的,因为MemCache的缓存机制和Session非常相似。另外,MemCach可以做分布式,能够把Web服务器中的内存组合起来,成为一个”内存池”,不管是哪个服务器产生的Session,都可以放到这个 “内存池”中、其他的Web服务器都可以使用。以这种方式来同步Session,不会加大数据库的负担,冰洁安全性也要比使用Cookie高。把session放到内存里面,读取也要比其他处理方式快很多。 自定义使用memcached处理session信息,和自定义数据库的处理方式相同,但要简单得多,因为MemCache的工作机制和Session技术很相似。同样采用面向对象类的设计方法,也需要借助session_set_save_handler()函数来自定义处理过程,在memsession.class.php中声明类MEMSession的代码:
2、<?php Class MEMSession{ Const NS=”se衡痕贤伎ssion_”; Protected static $me罪焐芡拂m=null; Protected static $lifetime=null;Public static function start(Memcache $mem){ Self::$mem=$mem; Self::$lifetime=ini_get(“session.gc_maxlifetime”);Session_set_save_handler( Array(__CLASS__,’open’),Array(__CLASS__,’close’),Array(__CLASS__,’read),Array(__CLASS__,’write),Array(__CLASS__,’destroy), Array(__CLASS__,’gc));Session_start();}Private static function open($path,$name){ Return true;}Public static Function close(){Return true;}Private static Function read($id){$out = self::$mem->get(self::session_key($sid));If($out ===false || $out ===null){ Return ‘’;}Return $out;}Public staticFunction write($sid,$data){$method = $data ?’set’:’replace’;Return selft::$mem->$method(self::session_key($sid),$data,MEMCACHE_COMPRESSED,self::$lifetime);}Public static Function destroy($sid){Return self::$mem->delete(self::session_key($sid));}Function gc($maxlifetime){Return true;}Private static function session_key($sid){$session_key =””;If(defined(‘PROJECT_NS’)){ $session_key.=PROJECT_NS:}$session_key.=self::NS.$sid;Return $session_key;}}
3、本例声明的MEMSession类也可以直接应用在你的项目中。在上例的MEMSession类中也是声明了一个静态方法static(),用来开启会话及使用session_set_save_handler()函数自定义回调Session声明周期每个环节。另外,本例的声明比较简单,只是将Session的处理环节转嫁到了MemCache服务器的存取上。使用的方法和DBSession的应用相同。一是在有开启会话的位置,就将本了加载并直接调用静态方法static(),传递一个创建好的Memcache类的对象即可。
4、<?phpRequire “memsession.class.php”;$mem = new Memcache();$mem ->addServer(“localhost”,11211);//$mem->addServer(“www.baidu.com”,11211);//$mem->addServer(“jingyan.baidu.com”,11211);MEMSession::start($mem);$_SESSION[‘username’]=’admin’;Echo $_SESSION[‘username’];除了使用本例自定义的方式将Session保存到memcached服务器中,还可以通过修改php.ini文件中的session.save_handler和session.save_path两个选项,直接将Session信息保存到memcached服务器中,首先,设置session.save_hander选项的值为”memcache”,用来确定使用MemCache处理会话,再通过session.save_path选项设置存储的各memcached服务器连结的分隔符号,如”tcp:/host1:11211,tcp://host2:11211”。每个服务器的连结也都可以包含被接收于该服务器的参数,比较类似于使用Memcache::addServer()来添加服务器,如”tcp://host1:11211?persistent=1&weight=1&timeout=1&retry_interval=15”