【问题标题】:Codeigniter: DB Cache check if record loaded from Database OR from CacheCodeigniter:数据库缓存检查是否从数据库或缓存加载记录
【发布时间】:2018-02-18 19:59:47
【问题描述】:

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

谢谢!

【问题讨论】:

  • 你必须检查缓存文件是否存在。检查这些文件的命名。它由 URI 段命名。测试几个查询,您将得出这些文件的命名约定。

标签: php mysql codeigniter caching


【解决方案1】:

尚不清楚您为什么需要/想要这样做。假设查询缓存已启用,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 段(控制器类名和函数名)来确定保存缓存文件的文件夹。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    相关资源
    最近更新 更多