既存システムにページキャッシュを入れてみる

既存CMSで構築されたシステムを移植する作業中なのですが、急ぎ負荷問題だけ解消しておきたいサイトがあったので先行してキャッシュだけ導入しておきました。
Zend_Cacheのページキャッシュが適用できるようなサイトならこの作業は数分で済みます。オプションを入れてstart()するだけ。とても簡単です。
エントリーポイントで下記のような記述を入れます。

<?php
$backendOptions = array('cache_dir' => '/path/to/cachedir');
$frontendOptions = array(
'lifetime' => 360,
'debug_header' => true,
'default_options' => array(
	'cache_with_cookie_variables' => true,
	'cache_with_get_variables' => true,
	'cache_with_session_variables' => true,
	'make_id_with_session_variables' => false,
	'make_id_with_cookie_variables' => false,
	),
);
require_once('Zend/Cache.php');
$cache = Zend_Cache::factory('page', 'file', $frontendOptions, $backendOptions);
$cache->start();

これで、通常のget系のリクエストを、キャッシュできます。
最近では、ここまでシンプルなサイトというのは、あまりないので、基本的にページキャッシュの出番はないような気もしますが。

少しだけカスタマイズ

フロントエンドオプションで'debug_header' => true,を指定すると、キャッシュにヒットしているときにその旨表示できます。デフォルトでは、文書の冒頭に入るのですが、ステージング環境等でチェックする際にXML宣言の前にデバッグヘッダーが入るのも気持ちがわるいので、少しだけカスタマイズしてみました。
Zend_Cache_Frontend_Pageのstartメソッド内で

<?php
    if ($this->_specificOptions['debug_header']) {
        echo "This is a cached page !";
    }

となっている部分をecho $data;の次の行へ移動させてコメントタグで囲いました。
ページキャッシュの場合、この辺を工夫しておくと、管理権限があるときにページキャッシュを削除するボタンを配置といった工夫も出来そうです。たとえば、上記デバッグヘッダー部分で、キャッシュIDを入れておくことができるので管理画面等でページをクロールしながらスクレイピングしてコマンドを育成とか。

1点だけ注意

Zend_Cache_Frontend_Pageでは、ホスト情報を読み込まないので、マルチドメインで運用してる時には$_GETにホスト情報を入れるとか、そういう工夫が必要。スキーマはともかく、ホスト名の違いぐらいは認識してほしい気がするが、別ドメインで同じコンテンツということもあるから微妙なところかな。
キャッシュの保存ディレクトリを与えるところでホスト名ごとにディレクトリを分けるという方が正しい対応かもしれない。