我在Codeigniter中实现了一个数据库缓存,并希望检查记录或缓存文件是否对查询进行了清除。
就我可能阅读Codeigniter Documentation而言,无法检查它。那么,任何人都可以给我一个提示吗?
以下是我想要实现的流程图
if (!$this->db->query_exists("QUERY HERE"))
// DO SOMETHING. Query Doesn't exists in CACHE
// Run the query in any case
$this->db->query("QUERY HERE");
谢谢!
答案 0 :(得分:0)
目前还不清楚为什么需要/想要这样做。假设启用了查询缓存,Codeigniter数据库驱动程序已经执行此检查,并将使用缓存查询(如果存在)或将执行查询并缓存它(如果不存在)。您必须实现的主要功能是在执行使缓存结果无效的记录插入,更新或删除时清除相应的缓存。
也就是说,确定缓存是否存在的最简单方法是CI_DB_Cache::read($sql)
方法。如果找不到匹配的缓存文件,则该方法返回FALSE。
数据库驱动程序有一个公共属性 - $ CACHE。 (是的,它是一个全大写的变量名。)$ CACHE是CI_DB_Cache
类的一个实例。
仅在执行读取类型查询后才定义此属性。这可能是一个"捕获22" - 在执行读取查询之前,您无法检查缓存文件,但是在执行读取查询之前要检查。
查看protected function _cache_init()
中的/system/database/DB_driver.php
,了解CI_DB_Cache
类是如何实例化的。您可能需要在代码中实现相同的类型。
您可能还会发现查看$this->CACHE
public function query($sql, $binds = FALSE, $return_object = NULL)
/system/database/DB_driver.php
中$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");
将成为查询结果对象。
但是,您必须删除缓存才能完成
rpm -qi {packagename}
如果没有删除,您将最终获得已检索到的相同查询结果对象。
请记住,Caching类完全依赖于浏览器请求的URI。缓存使用前两个URI段(控制器类名称和函数名称)来确定包含缓存文件的文件夹。