使用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=”session_”;
Protected static $mem=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、<?php
Require “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”