キャッシュ・コントロール
ここでは、symfonyにおけるキャッシュの取り扱いについて紹介します。
キャッシュされる範囲とその仕組み
他のwebアプリケーションフレームワーク同様に、symfonyにおいてもキャッシュのコントロールを行う事が可能になっています。ただしsymfonyにより出力されたHTMLはデフォルトではキャッシュされず、YAMLファイルなどの設定がキャッシュされています。symfonyにより出力されたHTMLがデフォルトでキャッシュされていないのはその動的な性質をとる可能性が故ですが、制作者側が変化しないと分かっている部分についてキャッシュをとる事で、サイトがスピードアップします。
キャッシュ先はハードディスクであり、基本的に「<プロジェクトフォルダ>/cache」内に置かれています。
キャッシュフォルダの構造
実際のキャッシュフォルダの構造を示しておきます。フォルダの内容は、基本的にアプリケーションフォルダのそれに準じています。
cache/
<アプリケーション名>/
<prod(通常の製品環境), dev(開発環境(第1回参照))などの環境名>/
config/
i18n/
modules/
template/
<ホスト名> (例えば国際化機能等でビュー(言語)の
異なる複数(国)のホスト名を使い分けている場合など、
ホスト名ごと(国別)にキャッシュを整理する)
all/
キャッシュ設定ファイル
キャッシュのオン/オフは「settings.yml」で指定します。
prod: ... dev: .settings: ... cache: off ...
環境ごとにキャッシュの有無を設定します。開発環境では、設定をすぐに反映させるためにデフォルトでキャッシュはオフになっています。
また、キャッシュの範囲に関しては、モジュールフォルダ内の「config/cache.yml」で設定します。以下に例を示します。
list: enabled: on edit: enabled: on all: with_layout: false # Default value lifetime: 86400 # Default value
実際には下記のようなフォーマットになっています。
<アクション名>: enabled: on (キャッシュのオン/オフ)
範囲ごとのキャッシュの方法
symfonyにより出力されたHTMLをキャッシュする場合、その範囲をある程度決める事ができます。
アクションのキャッシュ
「cache.yml」でアクションごとに設定できます。先程の例の通りですが、アクションごとに保持期間などを決めることもできます。
show: enabled: on (オン/オフの設定) with_layout: false (レイアウトもキャッシュするか否か) lifetime: 86400 (保持期間)
この時、scaffolding機能で生成したshowアクションのように特定のIdクエリを持っていたとしても、クエリ情報単位ごとのキャッシュが作成されます。
以下に、モジュールmod3において「cache.yml」を設定した例を示します。cachesampleアクションでキャッシュをオンにしています。
# cache.yml mod3 index: enabled: off cachesample: enabled: on all: with_layout: false lifetime: 86400
次のような「cachesampleSuccess.php」で、実際にキャッシュされているかを見てみましょう(実際の時刻はコンポーネントスロットで表示しています)。
現在 <?php echo date("Y年n月j日 Ah:i:s") ?> です。 <br />

パーシャル/コンポーネント/コンポーネントスロットのキャッシュ
これも「cache.yml」で、アクションの場合同様に設定できます。ラベルには、パーシャル名(「_」で始まるもの)をつけます。
_headline: enabled: on contextual: true
「contextual: true」の部分は、アクションごとに違った断片を表示するようなコンポーネントをキャッシュする時のオプションです。
テンプレート断片のキャッシュ
より細かなキャッシュは、cache()ヘルパーを用いることで可能になります。具体的には次のように用います。
<?php if (!cache('users')): ?> (テンプレート断片) <?php cache_save() ?> <?php endif; ?>
上記のIf文では「users」というテンプレート断片のキャッシュが存在するか判断し、存在すればキャッシュが表示されます。存在しなければ(テンプレート断片)の部分が処理され「cache_save()」で「users」キャッシュとして記録されます。以下、モジュールmod3の「indexSuccess.php」中にこれを用いてみましょう。
現在 <?php echo date("Y年n月j日 Ah:i:s") ?> です。 <br /> キャッシュされた日時は <?php if(!cache('date')): ?> <?php echo date("Y年n月j日 Ah:i:s") ?> <?php cache_save() ?> <?php endif;?> です。 <br />
キャッシュヘルパーを利用した部分だけがキャッシュされているのが分かります。

キャッシュクリアの具体的な方法
一旦キャッシュされた内容を意図的にクリアしたい時もあります。例えば設定変更などをしてその結果をすぐに見たい時などです。前回までは、
> symfony cc
としてきましたが、これは
> symfony clear-cache
の略記で、全キャッシュのクリアを行っています。ここではもっと具体的に、範囲を指定したキャッシュクリアの方法を紹介します。
以下はmybbsアプリケーションのキャッシュクリアのみ行います。
> symfony clear-cache mybbs
以下はmybbsアプリケーションのテンプレート(symfonyにより出力されたHTMLのキャッシュ)のキャッシュクリアを行います。
> symfony clear-cache mybbs template
以下はmybbsアプリケーションの設定キャッシュをクリアします。
> symfony clear-cache mybbs config
sfViewCacheManagerオブジェクトがこれを実現します。下記のようにアクションごとにキャッシュクリアを行います。$cacheManager = $this->getContext()->getViewCacheManager(); $cacheManager->remove('bbsdata/list'); (listアクションのキャッシュクリア) $cacheManager->remove('bbsdata/show?id='.$id); ($idのshowアクションのキャッシュクリア)
今回のまとめ
今回はsymfonyにおけるビューについてパーシャルなどの断片化要素などを紹介しながら概観し、さらにルーティングやキャッシュコントロールについて触れました。次回は国際化機能やプラグイン、Ajaxの利用などについて触れる予定です(今回紹介する予定でしたNumber・I18N・Javascriptなどのヘルパーは、次回国際化機能・Ajax利用の項にて扱います)。
参考文献
- 『The Definitive Guide to Symfony』 Francois Zaninotto・Fabien Potencier 著、Apress、2007年1月
