CI中使用memcached

本文介绍了如何在CodeIgniter框架中使Cache_memcached.php驱动兼容memcache和memcached扩展。主要涉及在_setup_memcached方法中进行条件判断以适配不同扩展的参数,并提供了一个自定义的memcached_lib.php库文件示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

找到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);
        }
    }
    
    
}


这段代码也是从网上拔得

每个方法是干嘛的,注释都写的很清楚

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值