修改ThinkPHP缓存类 使支持Memcached类和Aliyun OCS

By | 2014年3月11日

一、首先你要确定你的环境已经支持安装Memcached的客户端并已经能够连接阿里云的OCS。

二、找到ThinkPHP目录下的“/Extend/Driver/Cache/CacheMemcache.class.php”这个文件,另存一份在原来的目录,并命名为“CacheMemcached.class.php”,然后我们对“CacheMemcached.class.php”这个文件进行如下修改。

1.把该文件类的声明部分的“CacheMemcache”改为“CacheMemcached”,即“class CacheMemcached extends Cache{…}”;

2.修改构造函数(先贴代码,回头再作说明):

function __construct($options=array()) {
if ( !extension_loaded('memcached') ) {
throw_exception(L('_NOT_SUPPERT_').':memcached');
}

$options = array_merge(array (
'host' => C('MEMCACHED_HOST') ? C('MEMCACHED_HOST') : '127.0.0.1',
'port' => C('MEMCACHED_PORT') ? C('MEMCACHED_PORT') : '11211',
'username' => C('MEMCACHED_USER') ? C('MEMCACHED_USER') : null,
'password' => C('MEMCACHED_PWD') ? C('MEMCACHED_PWD') : null,
'ocs' => C('MEMCACHED_OCS') ? C('MEMCACHED_OCS') : false,
'timeout' => C('DATA_CACHE_TIMEOUT') ? C('DATA_CACHE_TIMEOUT') : false,
'persistent' => false,
),$options);

$this->options = $options;
$this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME');
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
$this->handler = new Memcached;
if($options['persistent'] && $options['timeout'] !== false){
$this->handler->setOption(Memcached::OPT_CONNECT_TIMEOUT,$options['timeout']);
}
//阿里云OCS
if($options['ocs']){
$this->handler->setOption(Memcached::OPT_COMPRESSION, false);
$this->handler->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$this->handler->addServer($options['host'],$options['port']);
$this->handler->setSaslAuthData($options['username'], $options['password']);
}else{
$this->handler->addServer($options['host'],$options['port']);
}
}

3.修改set函数:

public function set($name, $value, $expire = null) {
N('cache_write',1);
if(is_null($expire)) {
$expire = $this->options['expire'];
}
$name = $this->options['prefix'].$name;
if($this->handler->set($name, $value , $expire)) {
if($this->options['length']>0) {
// 记录缓存队列
$this->queue($name);
}
return true;
}
return false;
}

4.修改配置文件

//数据缓存配置
'DATA_CACHE_TYPE'=>'MEMCACHED',
//阿里云OCS配置
'MEMCACHED_OCS' => true,
'MEMCACHED_HOST'=>'***********.m.cnhzalicm10pub001.ocs.aliyuncs.com',
'MEMCACHED_USER' =>'***********',
'MEMCACHED_PWD' => '***********',

5.到控制器中测试

$cache = Cache::getInstance();

$cache->set('hello','world',60);

echo $cache->get('hello');

exit();

Category: PHP

发表评论