Codeigniter 2.0版本的 缓存备份问题

CI提供了数据文件缓存功能,可在database.php中开启文件缓存,

$db['default']['cache_on'] = TRUE;
$db['default']['cachedir'] = './cache/';

    缓存的文件存放在APPPATH同级的目录cache下.当然,这可减少数据库查询次数。


  当开启了缓存,在项目中使用CI自带的数据备份功能时,出现了此错误


Codeigniter 2.0版本的 缓存备份问题_第1张图片

    

将cache_on设置为FALSE时就没这个问题,所以可以得出,是缓存的问题,怎么处理呢?查看mysql_utility.php中的132行如下所示

$query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table));
 此query的方法在DB_Driver.php里面,往下阅读,你可以看到这二句

//第277行   
    if ($this->cache_on == TRUE AND stristr($sql, 'SELECT')){
        if ($this->_cache_init()){
            $this->load_rdriver();
            if (FALSE !== ($cache = $this->CACHE->read($sql))){
                    return $cache;
            }
        }
    }
           
//第290行
        if ($this->cache_on == TRUE AND $this->_cache_init())
        {
            // We'll create a new instance of the result object
            // only without the platform specific driver since
            // we can't use it with cached data (the query result
            // resource ID won't be any good once we've cached the
            // result object, so we'll have to compile the data
            // and save it)
            $CR = new CI_DB_result();
            $CR->num_rows        = $RES->num_rows();
            $CR->result_object   = $RES->result_object();
            $CR->result_array    = $RES->result_array();
           
            // Reset these since cached objects can not utilize resource IDs.
            $CR->conn_id     = NULL;
            $CR->result_id       = NULL;
           
            $this->CACHE->write($sql, $CR);
        }

   第一句是从缓存中读取数据,返回缓存数据,第二句自然是写入缓存,注意这里的 result_id,在_backup中使用到.而这里却把它置为了空值,所以当我们从缓存中读取的数据时,它的result_id为空, 就报了上面的异常.


好了,修复方法如下,我这里只是方便,直接在原代码上增加了一个boolean布尔值,当然还是推荐大家继承实现.

1、在DB_driver.php 中的query方法增加了一个boolean字段 ($bool_cache)
function query($sql, $binds = FALSE, $return_object = TRUE,$bool_cache=TRUE)
       
2、将此字段放到读取与写入缓存处
 if ($this->cache_on == TRUE AND stristr($sql, 'SELECT') AND $bool_cache==TRUE)
 if ($this->cache_on == TRUE AND $this->_cache_init() AND $bool_cache==TRUE)
        
这样我们就能控制是否从缓存中读取数据,
       
3、修改mysql_utility.php中的_backup的第133行,修改为
 $query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table),FALSE,TRUE,FALSE);
   这里只是将FALSE传递过去,表明此处不用从缓存中读取.



来源地址: CI缓存备份

-----------广告区


休闲豆,IT资讯,IT新闻资讯,电影BT下载,高清电影下载,电影下载,单机游戏下载,游戏下载,电子书下载,电子书PDF下载

你可能感兴趣的:(CodeIgniter,2.0版本的 缓存备份问题)