Thinkphp中Memcache驱动的实现

标准

  用过thinkphp的都知道,ThinkPHP提供了方便的缓存方式,包括数据缓存、静态缓存和查询缓存等,支持包括文件方式、APC、Db、Memcache、Shmop、Sqlite、Redis、Eaccelerator和Xcache在内的动态数据缓存类型,以及可定制的静态缓存规则,并提供了快捷方法进行存取操作。下面我们来研究下Memcache缓存如何使用。

      首先安装Memcached(此步略过,不懂的可以百度、谷歌),确认Memcache服务器正常运行,我们就来写一个扩展驱动了。TP的文档中有如下描述:

缓存驱动

系统的缓存实现是由缓存类和缓存驱动组成,缓存驱动扩展位于Extend/Driver/Cache目录下面,目前已经提供了包括APC、Db、Memcache、Shmop、Sqlite、Redis、Eaccelerator和Xcache缓存方式的驱动扩展,缓存驱动必须继承Cache类,缓存驱动类的命名规范是:
Cache+驱动类名称(首字母大写)
并实现下面的驱动接口:

方法说明接口方法架构方法__construct($options=”)读取缓存get($name)写入缓存set($name,$value,$expire=null)删除缓存rm($name)清空缓存clear()

注意:有些缓存方式并未提供清空缓存接口,可以无需定义。

好了,下面送上我写的驱动类源码:

<?php class SessionMemcache { private static $handler=null; private static $lifetime=null; private static $time = null; private static $ns=NULL; private static function init($handler){ self::$handler=$handler;//$memcache对象 self::$lifetime=ini_get('session.gc_maxlifetime');//生存周期 self::$time=time();//当前时间,用于判断是否超过生成周期 self::$ns=C('SESSION_PREFIX');//session前缀,防止session冲突 } public static function start(Memcache $memcache){ self::init($memcache); session_set_save_handler( array(__CLASS__, 'open'), array(__CLASS__, 'close'), array(__CLASS__, 'read'), array(__CLASS__, 'write'), array(__CLASS__, 'destroy'), array(__CLASS__, 'gc') ); session_start(); } //接口方法,下周 public static function open($path, $name){ return true; } public static function close(){ return true; } public static function read($PHPSESSID){ $out=self::$handler->get(self::session_key($PHPSESSID)); if($out===false || $out == null) return ''; return $out; } public static function write($PHPSESSID, $data){ $method=$data ? 'set' : 'replace'; return self::$handler->$method(self::session_key($PHPSESSID), $data, MEMCACHE_COMPRESSED, self::$lifetime); } public static function destroy($PHPSESSID){ return self::$handler->delete(self::session_key($PHPSESSID)); } public static function gc($lifetime){ return true; } private static function session_key($PHPSESSID){ $session_key=self::$ns.$PHPSESSID; return $session_key; } public function execute() { $htmltip='连接服务器失败,请刷新后再试!' $memcache=new Memcache; $memcache->connect(C('MEMCACHE_HOST'), C('MEMCACHE_PORT')) or die($htmltip); self::start($memcache); } }

上面实现了驱动的接口方法,其中C方法读取TP的配置参数,C('SESSION_PREFIX')是session前缀,C('MEMCACHE_HOST')是memcached服务器的地址,C('MEMCACHE_HOST')是服务器端口,将上面的代码写进文件并命名为SessionMemcache.class.php,然后放到TP的扩展驱动文件夹下,TP就可以自动加载了。

驱动写好了,下面我们来配置下,让TP的中session使用memcache模式。在confing.php中加上如下代码:

'SESSION_TYPE' =>'Memcache',//session采用memcache模式(默认是file模式) 'SESSION_PREFIX' => 'wintrue', //Session前缀设置 ,避免在同域中冲突、共享 'SESSION_OPTIONS'=>array( 'expire'=>600,//生成周期 ), 'MEMCACHE_HOST' => 'localhost',//memcached服务器地址 'MEMCACHE_PORT' => '11211',//memcached服务器端口

这样session就存在memcached服务器中了,如果是多个站点,都存在一个memcached服务器中,那么就实现了session共享。

本人才疏学浅,望路过的大侠指点一二。

原创文章,转载请注明出处 by wintrue

发表评论