データベースキャッシュクラス
データベースキャッシュクラスを利用すれば、データベース読み込みの負荷を軽減するために、問合せ結果をテキストファイルとしてキャッシュすることが可能になります。
Important: このクラスは、キャッシュが有効な場合、データベースドライバにより自動的に初期化されます。手動でロードしてはいけません。
Also note: キャッシュを使った場合、クエリ結果のメソッドの一部が利用できません。このページを注意して読んでください。
キャッシュの有効化
次の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 というページを見ているとき、キャッシュシステムは、そのURLに関連するすべてのキャッシュファイルを blog+comments という名前のフォルダに保存します。それらの特定のキャッシュファイルを削除するには次のようなコードを使います:
$this->db->cache_delete('blog', 'comments');
パラメータを指定していないときは、指定されたURIをもとにどのキャッシュを消すべきかが決められます。
$this->db->cache_delete_all()
すべてのキャッシュファイルを削除します。例:
$this->db->cache_delete_all();