Codeigniter:DB Cache检查从数据库或从Cache加载的记录

时间:2017-09-10 13:15:41

标签: php mysql codeigniter caching

我在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");

谢谢!

1 个答案:

答案 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段(控制器类名称和函数名称)来确定包含缓存文件的文件夹。