キャッシュの利用 | Cache

データベースや他のサービスから取得したデータを、キャッシュに格納することはよくあります。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;

関連項目