2011年5月7日土曜日

[sf] カスタム設定ファイルからの読み出しをキャッシュする

【開発環境】symfony 1.4.10

symfonyを使ったWebアプリケーション開発での出来事。

アプリケーション用に作成したカスタム設定ファイル(YAML)を、sfYaml::loadで読み出す仕組みにしていました。
# <application>/config/navigation.yml
Nav:
  top:
     label: "トップ"
    linkto: "site/index"
  activity:
    label: "活動ログ"
    linkto: "activity/list"
  course:
    label: "コース▼"
    linkto: "course/map"
...省略...


しかし、ユーザからWEBページにアクセスするたびに、YAMLファイルを解析して配列に変換していては効率が悪い。
さらに、一度設定すれば、たびたび変更するファイルでもない。

例えば、symfony標準の設定ファイル、settings.yml、app.ymlなどは、YAMLファイルの内容をPHPコード化して読み出しを高速化している。

同様にして、navigation.ymlもPHPコード化して、キャッシュする仕組みに変更する。


1.navigation.ymlの読み出しハンドラーを設定する。ハンドラーの種類はいくつかあり、設定内容をsfConfigに結合するハンドラ(sfDefineEnvironmentConfigHandler)などがあるが、sfYaml::loadと同じ挙動にするため、sfSimpleYamlConfigHandlerを利用する。
次のように、<application>/config/config_handlers.ymlを作成する。
# <application>/config/config_handlers.yml
config/navigation.yml:
  class: sfSimpleYamlConfigHandler


2.sfYaml::loadの箇所を変更する。
■変更前
$yml = sfYaml::load(sfConfig::get('sf_app_config_dir').DIRECTORY_SEPARATOR.'navigation.yml');
■変更後
$yml = include(sfContext::getInstance()->getConfigCache()->checkConfig('config/navigation.ym
'));


ちなみに、キャッシュファイルの内容を確認すると、YAMLの内容がPHPの配列化されており、その結果がreturnされていることが分かる。
#cache/<application>/<environment>/config/config_navigation.yml.php
<?php
// auto-generated by sfSimpleYamlConfigHandler
// date: 2011/05/07 09:19:26
return array (
  'Nav' => 
  array (
    'top' => 
    array (
      'label' => 'トップ',
      'linkto' => 'site/index'
      ),
...省略...


これで変更おわりです。設定ファイルの内容を変更した際は、symfony ccでキャッシュを削除してください。

0 件のコメント:

コメントを投稿