2017-09-10 10 views
0

CodeigniterでDBキャッシュを実装していて、そのレコードまたはキャッシュファイルがクエリに対して存在するかどうかを確認したい。Codeigniter:DBキャッシュがレコードをデータベースからロードしたかどうかを確認するORキャッシュ

私が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を返します。

DBドライバには、$ CACHEというパブリックプロパティがあります。 (はい、すべて大文字の変数名です。)$ CACHEはCI_DB_Cacheクラスのインスタンスです。

このプロパティは、読み取りタイプのクエリが実行された後でのみ定義されます。これは "キャッチ22"となる可能性があります。読み取りクエリが実行されるまでキャッシュファイルをチェックすることはできませんが、キャッシュファイルを実行する前にチェックしたいと考えています。

protected function _cache_init()/system/database/DB_driver.phpに見て、CI_DB_Cacheクラスがどのようにインスタンス化されているかを確認してください。あなたのコードに同じ種類のものを実装する必要があるかもしれません。

public function query($sql, $binds = FALSE, $return_object = NULL)$this->CACHEがどのように使用されているかを確認すると便利です。/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"); 

を達成することができます前に、キャッシュを削除する必要が

キャッシングクラスは、ブラウザから要求されたURIに完全に依存していることに注意してください。キャッシングは、最初の2つのURIセグメント(コントローラクラス名と関数名)を使用して、キャッシュファイルを保持するフォルダを決定します。

関連する問題