なぜこれが必要なのかは分かりません。クエリキャッシュが有効であると仮定すると、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セグメント(コントローラクラス名と関数名)を使用して、キャッシュファイルを保持するフォルダを決定します。
キャッシュファイルが存在するかどうかを確認する必要があります。これらのファイルの命名を確認してください。 URIセグメントによって命名されます。いくつかのクエリをテストし、それらのファイルの命名規則を締結します。 – Tpojka