既存システムにページキャッシュを入れてみる
既存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を入れておくことができるので管理画面等でページをクロールしながらスクレイピングしてコマンドを育成とか。
そういうのを遅延ロードとは言わないのでは?
nullを返さないためにgetterで初期化するのはありだけど、初期化するためにgetterを呼ぶのは違う気がする。