CakePHP HTML Cache Plugin についてメモしておきます。
CakePHPにはキャッシュの機能がありますが、純粋な静的ファイルを書き出すもっと強力なキャッシュをおこなうためのプラグインがあります。
(symfonyでは sfSuperCache 、Fuel PHP ではfuel-pagecacheという同様のプラグイン等があるそうです)
仕組みは、mod_rewriteの機能を利用し、webroot/cache以下に、該当するhtmlやrss等のファイルがあれば、それを直接表示し、無ければ、CakePHPが通常の描画後、webroot/cache以下にページを書き出すというもの。
一度作成するとphpすら使われませんので当然速いわけです。
ただしそのファイルを消さないと永遠にCakePHPが再表示しませんので、以下のコマンドのようなことでファイルを消してあげる必要がありますが。
find /full/path/to/app/webroot/cache -mmin +360 | xargs rm -f
さてこのプラグイン、もともとはMatt Curry氏が作成したプラグインです。
その後CakePHP2.x系への対応がまだのようでしたので、forkして作成したのが、こちらです。
インストールと準備
ダウンロード後、APP/Plugin/HtmlCacheとなるように配置してください。
bootstrap.phpでPluginをloadします。
# APP/Config/bootstrap.php CakePlugin::load('HtmlCache');
webroot/.htaccess を修正します。
(修正内容は extras/.htaccess のようにします)
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_METHOD} ^GET$ RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f RewriteRule ^(.*)$ /cache/$1/index.html [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [QSA,L] </IfModule>
プラグインの使用
あとは、Controllerで $helpers = array('HtmlCache.HtmlCache'); のようにします。
ただ特定のactionだけ使用するというケースがほとんどでしょう。ですので。
viewファイル内で使用する場合は、次のようにします。
$this->Helpers->load('HtmlCache.HtmlCache'); $this->HtmlCache->options($options); // 必要に応じて
オプションの指定
オプションは配列で指定します。# view $this->HtmlCache->options(array('cache_dir' => 'statics'));
オプション(デフォルト)
- 'test_mode' => false,
- trueにするとdebug level が1以上でもキャッシュファイルを書き出します
- 'host' => null,
- 'domain' => false,
- trueにすると、複数ドメインで運用している場合にhostごとに書き出すことができます
- $_SERVER['HTTP_HOST']もしくはhostオプションの値が使用されます
- 'www_root' => APP . WEBROOT_DIR,
- webルートのフォルダをフルパスで指定します
- 'cache_dir' => 'cache',
- デフォルトでは webroot/cache 以下にキャッシュファイルが作られます
- ここを修正した場合は webroot/.htaccess も適宜修正しましょう
- 'filename' => 'index.html',
- 拡張子なしでCakePHPにアクセスしたときに書き出すファイル名です
- index.htm や index.php を使用したいという場合はここを書き換えます
- 'file_path' => null,
- まったく別のURL(パス)で書き出したいという場合は、ここを編集します
- 例) 'file_path' => $this->webroot . DS . $item['Item']['filename'],
というわけでRSS等の出力に絶大な効力を発揮する HtmlCache Plugin を紹介しました。