SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

symfony入門

symfony入門(4):symfonyプログラミング 開発のテクニック(前篇)

symfonyによる実践的なPHPアプリケーション開発


キャッシュ・コントロール

 ここでは、symfonyにおけるキャッシュの取り扱いについて紹介します。

キャッシュされる範囲とその仕組み

 他のwebアプリケーションフレームワーク同様に、symfonyにおいてもキャッシュのコントロールを行う事が可能になっています。ただしsymfonyにより出力されたHTMLはデフォルトではキャッシュされず、YAMLファイルなどの設定がキャッシュされています。symfonyにより出力されたHTMLがデフォルトでキャッシュされていないのはその動的な性質をとる可能性が故ですが、制作者側が変化しないと分かっている部分についてキャッシュをとる事で、サイトがスピードアップします。

 キャッシュ先はハードディスクであり、基本的に「<プロジェクトフォルダ>/cache」内に置かれています。

キャッシュフォルダの構造

 実際のキャッシュフォルダの構造を示しておきます。フォルダの内容は、基本的にアプリケーションフォルダのそれに準じています。

cache/
  <アプリケーション名>/
    <prod(通常の製品環境), dev(開発環境(第1回参照))などの環境名>/
      config/
      i18n/
      modules/
      template/
        <ホスト名>  (例えば国際化機能等でビュー(言語)の
          異なる複数(国)のホスト名を使い分けている場合など、
          ホスト名ごと(国別)にキャッシュを整理する)
          all/

キャッシュ設定ファイル

 キャッシュのオン/オフは「settings.yml」で指定します。

settings.yml
prod:
...
dev:
  .settings:
...
  cache:  off
...

 環境ごとにキャッシュの有無を設定します。開発環境では、設定をすぐに反映させるためにデフォルトでキャッシュはオフになっています。

 また、キャッシュの範囲に関しては、モジュールフォルダ内の「config/cache.yml」で設定します。以下に例を示します。

cache.yml
list:
  enabled:  on
edit:
  enabled:  on

all:
  with_layout:  false  # Default value
  lifetime:  86400  # Default value

 実際には下記のようなフォーマットになっています。

<アクション名>:
  enabled:  on  (キャッシュのオン/オフ)

範囲ごとのキャッシュの方法

 symfonyにより出力されたHTMLをキャッシュする場合、その範囲をある程度決める事ができます。

アクションのキャッシュ

 「cache.yml」でアクションごとに設定できます。先程の例の通りですが、アクションごとに保持期間などを決めることもできます。

cache.yml(例)
show:
  enabled:  on        (オン/オフの設定)
  with_layout: false  (レイアウトもキャッシュするか否か)
  lifetime:  86400    (保持期間)

 この時、scaffolding機能で生成したshowアクションのように特定のIdクエリを持っていたとしても、クエリ情報単位ごとのキャッシュが作成されます。

 以下に、モジュールmod3において「cache.yml」を設定した例を示します。cachesampleアクションでキャッシュをオンにしています。

cache.yml
# cache.yml mod3
index:
  enabled: off

cachesample:
  enabled: on

all:
  with_layout: false
  lifetime: 86400

 次のような「cachesampleSuccess.php」で、実際にキャッシュされているかを見てみましょう(実際の時刻はコンポーネントスロットで表示しています)。

cachesampleSuccess.php
現在
<?php echo date("Y年n月j日 Ah:i:s") ?>
です。
<br />
cache.ymlで設定したキャッシュの例
cache.ymlで設定したキャッシュの例

パーシャル/コンポーネント/コンポーネントスロットのキャッシュ

 これも「cache.yml」で、アクションの場合同様に設定できます。ラベルには、パーシャル名(「_」で始まるもの)をつけます。

cache.yml(抜粋)
_headline:
  enabled: on
  contextual: true

 「contextual: true」の部分は、アクションごとに違った断片を表示するようなコンポーネントをキャッシュする時のオプションです。

テンプレート断片のキャッシュ

 より細かなキャッシュは、cache()ヘルパーを用いることで可能になります。具体的には次のように用います。

cache()利用例
<?php if (!cache('users')): ?>
  (テンプレート断片)
<?php cache_save() ?>
<?php endif; ?>

 上記のIf文では「users」というテンプレート断片のキャッシュが存在するか判断し、存在すればキャッシュが表示されます。存在しなければ(テンプレート断片)の部分が処理され「cache_save()」で「users」キャッシュとして記録されます。以下、モジュールmod3の「indexSuccess.php」中にこれを用いてみましょう。

mod3/templates/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 />

 キャッシュヘルパーを利用した部分だけがキャッシュされているのが分かります。

cacheヘルパーで設定したキャッシュの例
cacheヘルパーで設定したキャッシュの例

キャッシュクリアの具体的な方法

 一旦キャッシュされた内容を意図的にクリアしたい時もあります。例えば設定変更などをしてその結果をすぐに見たい時などです。前回までは、

> 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月
  • symfony開発者らが自ら記した、symfonyガイドブックです。version1.0.0を前提に執筆されていますので、これからも問題なく利用できます(symfony本家サイトでオンライン閲覧できます)。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
symfony入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 川北 季(カワキタ ミノル)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1063 2007/03/09 10:05

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー