2017-09-10 30 views
0

我在Codeigniter中實現了數據庫緩存,並且想要檢查記錄或緩存文件是否存在於查詢中。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

您必須檢查緩存文件是否存在。檢查這些文件的命名。它由URI段命名。測試幾個查詢,你會得出這些文件的命名約定。 – Tpojka

回答

0

目前還不清楚爲什麼你需要/想要做到這一點。假設查詢緩存已啓用,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段(控制器類名稱和函數名稱)來確定包含緩存文件的文件夾。