データベースや他のサービスから取得したデータを、キャッシュに格納することはよくあります。Cacheパッケージはキャッシュを簡単に扱うためのクラス群を提供します。
Cacheパッケージの各クラスは下記のインターフェイスを実装しています。
interface Sabel_Cache_Interface
{
public function read($key);
public function write($key, $value, $timeout = 0);
public function delete($key);
}
write()メソッド の第3引数の $timeout はその書き込むデータの有効期間を秒数で指定します。例えば write("a", "data", 600) とした場合、明示的にdeleteしなくても、10分経過後にはデータが消滅するか取得できなくなります。
delete()メソッド は指定されたキーのデータを削除するとともに、その削除されたデータを返します。
※このパッケージの唯一の注意点は、false(論理型)を格納できないことです。falseは常にnullとして返されます。
File
Sabel_Cache_File はデータをファイルに保存します。ファイルはキーに対して一つ作成されます。例えば下記のように2つのデータを保存した場合 a.cache と b.cache という2つのファイルが作成されます。
$cache = Sabel_Cache_File::create("/path/to/cachedir");
$cache->write("a", 10);
$cache->write("b", 20);
create()メソッド にはキャッシュデータ(ファイル)を設置するディレクトリを指定してください。
このクラスはデータをファイルに保存するためWebサーバが複数台ある場合などは使用できません。そのような環境では下で説明する Sabel_Cache_Memcache を使用すると良いでしょう。
このクラスの実装では、ファイル操作時(読み取り・書き込み・削除)時にロックをしていません。書き込み時にファイルが空になる瞬間が存在するため、そのタイミングでデータを読み込んだ場合は null としてデータが返されます。
APC
Sabel_Cache_Apc はデータをAPC(メモリ)に保存します。このクラスは内部で Sabel_Kvs_Apcクラス を使用しています。
$cache = Sabel_Cache_Apc::create();
このクラスはデータをメモリに保存するため、Webサーバが複数台ある場合などは使用できません。そのような環境では下で説明する Sabel_Cache_Memcache を使用すると良いでしょう。
Memcache
Sabel_Cache_Memcache はデータを Memcachedサーバ に保存します。このクラスは内部で Sabel_Kvs_Memcacheクラス を使用しています。create()メソッド の第1引数は Memcachedサーバ のホスト名(IPアドレス)、第2引数はポート番号となっています。それぞれ省略した場合は
localhost, 11211 が使用されます。
$cache = Sabel_Cache_Memcache::create("memcache.example.com", 22122);
Sabel_Cache_Null
Sabel_Cache_Null は特殊なクラスで、簡単に言ってしまえば「何もしないクラス」です。キャッシュはしないけれどもインターフェイスは使用したい場合に使用されるクラスです。それは例えば開発環境時や、テスト実行時などです。
$cache = Sabel_Cache_Null::create();
Cacheファクトリ
libディレクトリの下に非常にシンプルな Cacheファクトリ があります。
lib/Cache.php
<?php
class Cache
{
private static $defaultBackend = "";
public static function create($backend = "")
{
if (empty($backend) && empty(self::$defaultBackend)) {
$message = __METHOD__ . "() must specify the backend.";
throw new Sabel_Exception_Runtime($message);
}
if ((ENVIRONMENT & PRODUCTION) < 1) {
return Sabel_Cache_Null::create();
}
...
switch ($backend) {
...
}
return $cache;
}
}
このファクトリは環境が PRODUCTION でない場合は常に Sabel_Cache_Null を返します。そのため、開発時やテスト実行時にキャッシュを使用することなく、また運用環境に切り替えた時にアプリケーションのコードを修正する必要もありません。
$defaultBackend に主に使用するバックエンドを指定しておけば create()メソッド の引数によるバックエンドの指定を省略することができます。例えばそのアプリケーションがキャッシュデータの格納先として主に Memcachedサーバ を使用するのであれば、下記のようにします。
class Cache
{
private static $defaultBackend = "memcache";
...
}
下記はキャッシュを使用する箇所のコードの例です。
$cache = Cache::create();
if (($data = $cache->read("key")) === null) {
$data = ...; // データベースなどからデータ取得
$cache->write("key", $data); // キャッシュにデータを格納
}
return $data;
関連項目