キャッシュというとページ単位のキャッシュを考える人も多いかもしれませんが、もっと手軽なPEAR::Cache_Liteを使用した関数単位でのキャッシュを紹介します。キャッシュはパフォーマンスをかなり向上させることができます。パフォーマンスの低下に悩んでいる方はぜひ試してみてください。

キャッシュを使用する場合、まずはキャッシュのヒット率を考える必要がありま す。例えば、アクセスしているユーザーごとに異なる結果を返す場合は、10回の アクセスがあっても、それが10人のユーザーからのアクセスであれば、キャッ シュを作るだけになってしまいます。

逆に、毎回同じ結果を返す場合は10回のアクセスがあると、はじめのアクセスで キャッシュを作成し、残りの9回のアクセスでは、キャッシュが使用されること になり、結果を作成するための処理を省略することができます。

では、以下のような関数にキャッシュ機能を追加することを考えてみましょう。

function cache_test($param) {
  // $str を作成するロジック
  return $str;
}

キャッシュのヒット率は$strを作成するロジックによって異なります。キャッ シュを有効活用できるのは、マスタの値をデータベース等から取得して返す場合 などが考えられます。

cache_test関数を以下のように変更することで、キャッシュを使用することがで きます。

function cache_test($param) {
  include_once "Cache/Lite.php";
  $option = array(
    "cacheDir" => "/tmp/",
    "lifeTime" => 60
  );
  $cache = new Cache_Lite($option);

  if ($data = $cache->get($param, "cache_test")) {
    return $data;
  } else {
    // $str を生成するロジック
    $cache->save($str, $param, "cache_test");
    return $str;
  }
}

Cache_Liteのコンストラクタでオプションを指定しています。すべてのオプショ ンについては http://pear.php.net/manual/ja/package.caching.cache-lite.cache-lite.cache-lite.php を参照してください。

今回指定しているのは、キャッシュの保存先ディレクトリと、キャッシュの有効 時間です。/tmp/ディレクトリにキャッシュファイルが保存され、60秒後に キャッシュが無効になります。

get()メソッドではcache_test()関数に指定された引数と、関数名を指定してい ます。第2引数の関数名(cache_test)によってキャッシュのグループを作成し ます。グループを指定するのは、別の関数で同じ引数($param)が与えられた時 に作成されたキャッシュを取得しないようにするためです。

第1引数の$paramの値ごとにキャッシュは作成されます。$paramが配列の場合に はserialize()関数を使用して文字列に変換します。こうすることで、get()メ ソッドでキャッシュが利用可能な場合には、そのデータが返され、キャッシュが 無い場合や有効期限が切れている場合は、FALSEが返されます。

キャッシュがある場合は、そのキャッシュの内容を返し、キャッシュが無い場合 のみ処理を実行し、返り値($str)を作成します。作成した返り値は、save()メ ソッドで保存します。なお、デフォルトでは保存・取得するキャッシュは文字列 のみなので、配列についてはserialize()関数などを使用して文字列に変換する 必要があります。

今回は関数単位でのキャッシュでしたが、ページ単位でキャッシュを作成するこ とも可能です。こちらについては、PEAR::Cache_Liteのマニュアル( http://pear.php.net/manual/ja/package.caching.cache-lite.php )を参考にし てください。

キャッシュはアクセス数が大きければ大きいほど有効です。頻繁に更新される データベースの値を参照する場合などでも、アクセス数が十分多ければ、1秒間 のキャッシュでも関数のパフォーマンスを向上させることができます。パフォー マンスの低下に悩んでいる方は一度試してみてはいかがでしょう。


(アシアル 森川穣)

この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。