尚不清楚您为什么需要/想要这样做。假设查询缓存已启用,Codeigniter DB 驱动程序已经进行了此检查,如果缓存查询存在,将使用缓存查询,否则将执行查询并缓存它。您必须实现的主要内容是在执行使缓存结果无效的记录插入、更新或删除时清除相应的缓存。
也就是说,确定缓存是否存在的最简单方法是CI_DB_Cache::read($sql) 方法。如果未找到匹配的缓存文件,该方法将返回 FALSE。
DB 驱动程序有一个公共属性 - $CACHE。 (是的,它是一个全大写的变量名。) $CACHE 是CI_DB_Cache 类的一个实例。
只有在执行读取类型查询后才会定义此属性。这可能是“catch 22” - 在执行读取查询之前您无法检查缓存文件,但您想在执行之前检查。
查看/system/database/DB_driver.php 中的protected function _cache_init() 以了解CI_DB_Cache 类是如何实例化的。您可能需要在代码中实现相同的功能。
您可能还会发现在public function query($sql, $binds = FALSE, $return_object = NULL) 和/system/database/DB_driver.php 中如何使用$this->CACHE 很有用。
您可能能够通过使用以下方法确定相关查询是否存在。我说可能是因为我还没有测试过。
$sql = "SELECT * from some_table";
//check that CACHE is defined
if(isset($this->db->CACHE))
{
$query = $this->db->CACHE->read($sql);
if($query === FALSE)
{
// DO SOMETHING. Query Doesn't exists in CACHE
}
}
如果找到缓存,$query 将是一个查询结果对象。
但是,您必须先删除缓存才能完成
// Run the query in any case
$this->db->query("QUERY HERE");
如果没有删除,您最终会得到与您已经检索到的相同的查询结果对象。
请记住,缓存类完全依赖于浏览器请求的 URI。缓存使用前两个 URI 段(控制器类名和函数名)来确定保存缓存文件的文件夹。