找到system/libraries/Cache/drivers/Cache_memcached.php
1._setup_memcached方法中大概165行左右,要先判断是否开启了memcached扩展
$this->_memcached = new Memcached();
修改为:
if (extension_loaded('memcached')){
$this->_memcached = new Memcached();
}else{
$this->_memcached = new Memcache();
}
2.还是_setup_memcached方法,大概171行左右
$cache_server['hostname'] = $this->_default_options['default_host'];
修改为
$cache_server['hostname'] = $this->_memcache_conf[$name]['default_host'];
$cache_server['port']和$cache_server['weight']也是一样修改
3. _setup_memcached方法,大概184行左右
$this->_memcached->addServer(
$cache_server['hostname'], $cache_server['port'], $cache_server['weight']
);
修改为
if (extension_loaded('memcached')){
$this->_memcached->addServer($cache_server['hostname'], $cache_server['port'], $cache_server['weight']);
}else{
$this->_memcached->addServer($cache_server['hostname'], $cache_server['port'], TRUE, $cache_server['weight']);
}
也是做一下判断是否开启了memcached扩展,因为memcache和memcached的addServer参数不一致
4.is_supported方法,第199行左右
if ( ! extension_loaded('memcached'))
修改为
if ( ! extension_loaded('memcached') && ! extension_loaded('memcache'))
两种扩展都没打开时,才return false;停止使用memcached 。
做完如上操作,CI的memcached就可以兼容memcache和memcached。
下面就可以自己写一个lib来使用
在libraries下创建一个memcached_lib.php
内容如下:
<?php
class memcached_lib{
/**
* 得到memcached的Information
*/
function get_stats(){
$CI =& get_instance();
$CI->load->driver('cache');
return $CI->cache->memcached->cache_info();
}
/**
* 数据缓存
*
* 该函数可选择以Memcache缓存还是以文件写入形式缓存。
* 如果开启Memcache,在config.php下修改$config['memcached']['enable']=TRUE;
* 否则缓存信息将以文本形式存储在application/cache文件夹下。
* 文件命名格式:$key+md5(ip_address+user_aguent);
* 如果能用Memcache就尽量用,不要使用文本,否则会产生一堆的垃圾文件
* 已写垃圾回收机制
* 注意,该函数缓存的数据只针对某个用户而非类似缓存新闻列表等全局调用的。
* 如需使用全局的缓存,则使用memory()方法替代
* @param string $cmd get|set|rm
* @param string $key
* @param mixed $value
* @param int $expire
* @return mixed
*/
function cache($cmd,$key,$value=null,$expire=600) {
static $ways = null;
$CI =& get_instance();
if(is_null($ways)){
$mem = $CI->config->item('memcached');
if($mem['enable'] === TRUE){
$ways = 'memcached';
}else{
$ways = 'file';
}
}
$CI->load->driver('cache');
$subfix = '';
$subfix .= trim(substr($CI->input->user_agent(), 0, 120));
$subfix .= $CI->input->ip_address();
$key .= '_'.md5($subfix);
switch ($cmd) {
case 'get':
return $CI->cache->$ways->get($key);
break;
case 'set':
return $CI->cache->$ways->save($key,$value,$expire);
break;
case 'rm':
$CI->cache->$ways->delete($key);
break;
}
}
/**
* 内存操作
* 此函数为使用全局memcache的便携操作
*
* $cmd = get|set|rm
*
* @param mix $cmd
* @param string $key
* @param mix $value
* @param int $expire
*/
function memory($cmd, $key, $value=null, $expire=600) {
static $enable = null;
$CI =& get_instance();
if (is_null($enable)) {
$mem_config = $CI->config->item('memcached');
$enable = $mem_config['enable'];
}
if ($enable) {
$CI->load->driver('cache');
switch ($cmd) {
case 'get': return $CI->cache->memcached->get($key); break;
case 'set': return $CI->cache->memcached->save($key, $value,$expire); break;
case 'rm' : return $CI->cache->memcached->delete($key); break;
}
}else {
show_error('Can not connect to memory server', 500);//在config.php下配置中打开memcahce
}
}
/**
* 文本方式缓存
*
* 使用文本缓存,效果跟memory一样
*
* @param string $cacheName
* @return mixed
*/
function file_cache($cmd, $key, $value=null, $expire=600) {
static $writeable = null;
$cache_path = APPPATH.'/cache';
if(is_null($writeable)){
$writeable = is_really_writable($cache_path);
}
if($writeable == TRUE){
$CI =& get_instance();
$CI->load->driver('cache');
switch ($cmd) {
case 'get': return $CI->cache->file->get($key); break;
case 'set': return $CI->cache->file->save($key, $value,$expire); break;
case 'rm' : return $CI->cache->file->delete($key); break;
}
}else{
show_error("Directory:$cache_path is unwritable",500);
}
}
}
这段代码也是从网上拔得
每个方法是干嘛的,注释都写的很清楚