データベースキャッシュクラス

データベースキャッシュクラスを利用すれば、データベース読み込みの負荷を 軽減するために、問合せ結果をテキストファイルとしてキャッシュすることが可能になります。

重要

このクラスは、キャッシュが有効な場合、データベースドライバにより 自動的に初期化されます。手動でロードしてはいけません。

重要

キャッシュを使った場合、クエリ結果のメソッドの一部が 利用できません。このページを注意して読んでください。

キャッシュの有効化

次の3つのステップで、キャッシュを有効にするにできます:

  • キャッシュファイルを保存できる書き込み可能なディレクトリをサーバに作 成します。
  • application/config/database.php ファイルに作成したキャッシュフォルダのパスをセットします。
  • application/config/database.php ファイルで設定してグローバルに キャッシュを有効化するか、後述するように手動で 有効化します。

有効化されると、データベースクエリを含むページが読み込まれると自動的に キャッシュが作成されます。

キャッシュ機能はどのように動作しますか?

CodeIgniter のクエリキャッシュシステムは、ページが閲覧されるときに動的 に動作します。 キャッシュが有効な時、初回アクセス時には、Web ページが読み込まれ、 クエリ結果オブジェクトがサーバのテキストファイル にシリアライズされて保管されます。次回アクセスしたときには、ページはデ ータベースにアクセスするかわりに キャッシュファイルを読み込みます。キ ャッシュされているページでは、データベースの使用率が0まで効果的に下がります。

結果を生成するのは 読み込みタイプ(SELECT) のクエリだけなので、このタイプだけがキャッシュ可能です。 書き込みタイプ(INSERT、UPDATE、など) のクエリは、結果を生成しないので、システムではキャッシュされません。

キャッシュファイルは期限切れになりません。キャッシュ済みのクエリはみな 、それを消すまでキャッシュされたままです。システムでは、 個別のページ に関連付けられたキャッシュをそれぞれ消すことができますし、キャッシュフ ァイル全体を削除することもできます。 通常は、データベースに新しい情報 を追加したときなど、何らかのイベントが発生した後に、 後述する清掃メソッドを使ってキャッシュファイルを削除するべきです。

キャッシュ機能によりサイトのパフォーマンスは改善しますか?

キャッシュを利用することによってどれだけパフォーマンスを得られるかは、 さまざまな要因に依存します。データベースの読み込みが非常に少なく、高度 に最適化されている場合は、パフォーマンスが高まったのがおそらくわからな いと思います。 データベースが高負荷で利用されている場合は、ファイルシ ステムが高負荷の状態でないなら、 応答速度が改善されるのがわかると思い ます。キャッシュ機能は、データの取得方法を単に変更し、 データベースの 操作をファイルシステムの操作にシフトさせるだけだということを覚えておいてください。

たとえば、あるクラスタサーバ環境では、ファイルシステムのオペレーション が高負荷になるので、キャッシュ機能はパフォーマンスの弊害になるかもしれ ません。 単一サーバの共有環境であれば、キャッシュ機能はおそらく有益で す。不幸なことに、 データベースをキャッシュすべきかどうかということに 対する一つの答えはありません。本当に、状況に依存しているのです。

キャッシュファイルはどのように保存されますか?

CodeIgniter では、各クエリが別々のキャッシュファイルに保存されます。 コントローラのメソッドの名前がついたサブフォルダの中にキャッシュファイ ルが保管されます。正確にいうと、 URIの最初の2セグメントと同じ名前のサブフォルダ (コントローラの名前とメソッドの名前)になります。

たとえば、3つのクエリが実行される comments というメソッドがある blog という名前のコントローラを作成していたとします。 キャッシュシステムは 、blog+comments という名前のキャッシュフォルダを作成し、 その中に3つのキャッシュファイルを書き込みます。

結果がURIの情報によって変わるような動的なクエリを使用している場合 (たとえばページネーションを使用しているとき)、異なる各クエリは、 それぞれ別のキャッシュファイルを生成します。ですので、 クエリの数よりも多くのキャッシュファイルが生成されることになります。

キャッシュファイルの管理

キャッシュには有効期限がないので、ご自身でアプリケーションにキャッシュの 削除処理を構築しなければなりません。たとえば、ユーザがコメントできるブログを 作成していたとします。新しいコメントが送信されるたびに、コントローラ のコメントを表示するメソッドに関連付けられたキャッシュファイルを削除し たいはずです。 後述する2つの削除メソッドを使って、データをクリアできます。

キャッシュ利用中には全データベース機能が使えるわけではありません

最後に、キャッシュされた結果オブジェクトは、完全な結果オブジェクトを単 純化したバージョンだという点を知っておく必要があります。 このため、結果オブジェクトのメソッドはいくつか利用できません。

キャッシュされた結果オブジェクトでは、次のメソッドは、利用できません :

  • num_fields()
  • field_names()
  • field_data()
  • free_result()

また、結果リソースは実行時の操作のみに付随するものなので、キャッシュし たときには、2つのデータベースリソース(result_id と conn_id) が利用できなくなります。

関数リファレンス

$this->db->cache_on() / $this->db->cache_off()

手動でキャッシュ機能を有効化/無効化します。特定のクエリを キャッシュさせないようにするときに役立ちます。例:

// キャッシュ機能を ON
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM mytable");

// このクエリは、キャッシュ機能を OFF
$this->db->cache_off();
$query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");

// キャッシュ機能を ON に戻す
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM another_table");

$this->db->cache_delete()

特定のページに関連付けられたキャッシュファイルを削除します。データベー スを更新したときにキャッシュを更新する必要がある場合に役立ちます。

キャッシュシステムは、閲覧中のページの URI に関連したフォルダにキャッシュファイルを保存します。 たとえば、example.com/index.php/blog/comments というページを見ているとき、 キャッシュシステムは、その URI に関連するすべてのキャッシュファイルを blog+comments という名前のフォルダに保存します。それらの特定のキャッシュファイルを 削除するには次のようなコードを使います:

$this->db->cache_delete('blog', 'comments');

パラメータを指定していないときは、現在の URI をもとにどのキャッシュ を消すべきかが決められます。

$this->db->cache_delete_all()

すべてのキャッシュファイルを削除します。例:

$this->db->cache_delete_all();