目前還不清楚爲什麼你需要/想要做到這一點。假設查詢緩存已啓用,Codeigniter DB驅動程序已經執行了此檢查,並且將使用緩存的查詢(如果存在),或者將執行查詢並緩存查詢,如果不存在的話。您必須執行的主要任務是在執行記錄插入,更新或刪除操作以使緩存的結果無效時清除適當的緩存。
也就是說,確定緩存是否存在的最簡單方法是CI_DB_Cache::read($sql)
方法。如果沒有找到匹配的緩存文件,該方法返回FALSE。
數據庫驅動程序有一個公共屬性 - $ CACHE。 (是的,這是一個全大寫的變量名稱。)$ CACHE是CI_DB_Cache
類的一個實例。
該屬性將僅在執行讀取類型查詢後定義。這可能是一個「catch 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");
沒有刪除你要與你已經檢索相同的查詢結果對象結束之前。
請記住,Caching類完全依賴於瀏覽器請求的URI。緩存使用前兩個URI段(控制器類名稱和函數名稱)來確定包含緩存文件的文件夾。
您必須檢查緩存文件是否存在。檢查這些文件的命名。它由URI段命名。測試幾個查詢,你會得出這些文件的命名約定。 – Tpojka