修改ThinkPHP缓存类 使支持Memcached类和Aliyun OCS - 全栈笔记

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

任亦伟 PHP 2014-03-11 302 次浏览 没有评论

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

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

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

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

01
02
function __construct($options=array()) {
03
  if ( !extension_loaded('memcached') ) {
04
    throw_exception(L('_NOT_SUPPERT_').':memcached');
05
  }
06
 
07
  $options = array_merge(array (
08
    'host' => C('MEMCACHED_HOST') ? C('MEMCACHED_HOST') : '127.0.0.1',
09
    'port' => C('MEMCACHED_PORT') ? C('MEMCACHED_PORT') : '11211',
10
    'username' => C('MEMCACHED_USER') ? C('MEMCACHED_USER') : null,
11
    'password' => C('MEMCACHED_PWD') ? C('MEMCACHED_PWD') : null,
12
    'ocs' => C('MEMCACHED_OCS') ? C('MEMCACHED_OCS') : false,
13
    'timeout' => C('DATA_CACHE_TIMEOUT') ? C('DATA_CACHE_TIMEOUT') : false,
14
    'persistent' => false,
15
  ),$options);
16
 
17
  $this->options = $options;
18
  $this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME');
19
  $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
20
  $this->options['length'] = isset($options['length'])? $options['length'] : 0;
21
  $this->handler = new Memcached;
22
  if($options['persistent'] && $options['timeout'] !== false){
23
    $this->handler->setOption(Memcached::OPT_CONNECT_TIMEOUT,$options['timeout']);
24
  }
25
  //阿里云OCS
26
  if($options['ocs']){
27
    $this->handler->setOption(Memcached::OPT_COMPRESSION, false);
28
    $this->handler->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
29
    $this->handler->addServer($options['host'],$options['port']);
30
    $this->handler->setSaslAuthData($options['username'], $options['password']);
31
  }else{
32
    $this->handler->addServer($options['host'],$options['port']);
33
  }
34
}
35

3.修改set函数:
01
02
public function set($name, $value, $expire = null) {
03
  N('cache_write',1);
04
  if(is_null($expire)) {
05
    $expire = $this->options['expire'];
06
  }
07
  $name = $this->options['prefix'].$name;
08
  if($this->handler->set($name, $value , $expire)) {
09
    if($this->options['length']>0) {
10
      // 记录缓存队列
11
      $this->queue($name);
12
    }
13
    return true;
14
  }
15
  return false;
16
}
17

4.修改配置文件
1
2
//数据缓存配置
3
'DATA_CACHE_TYPE'=>'MEMCACHED',
4
//阿里云OCS配置
5
'MEMCACHED_OCS' => true,
6
'MEMCACHED_HOST'=>'***********.m.cnhzalicm10pub001.ocs.aliyuncs.com',
7
'MEMCACHED_USER' =>'***********',
8
'MEMCACHED_PWD' => '***********',
9

5.到控制器中测试
1
2
$cache = Cache::getInstance();
3
 
4
$cache->set('hello','world',60);
5
 
6
echo $cache->get('hello');
7
 
8
exit();
9

发表评论

回顶部