現在JavaScriptの設定が無効になっています。このページを利用するにはJavaScriptの設定を有効にしてください。トップ全記事一覧テクノロジー2016.02.25SymfonyのバンドルConfigCacheBundleをオープンソースとして公開しましたマーケティングソリューションカンパニー開発本部UIフロントエンド開発部の三島です。PHPフレームワークSymfonyで使えるバンドルConfigCacheBundleをオープンソースとして先日公開しました。公開から少し時間がたちましたが、今回はあらためてこのバンドルの紹介をします。はじめにConfigCacheBundleはPHPフレームワークSymfonyで使えるバンドル(ライブラリ)です。https://github.com/yahoojapan/ConfigCacheBundlehttps://packagist.org/packages/yahoojapan/config-cache-bundleこのバンドルはYAMLやXMLなどの設定ファイルをキャッシュするという機能としてはシンプルなものです。付加的な機能としてキャッシュ生成前の事前処理や設定ファイルのマージ、バリデーション、多言語対応などを盛り込んでいます。以下ではConfigCacheBundleの簡単な使い方、機能について説明していきます。このバンドルを開発するに至った経緯についても説明します。使い方まずSymfonyが動作する環境をご用意ください。セットアップにはSymfonyのドキュメントが参考になります。Symfonyのバージョンは2.7以上に対応しています。3.0でも動作します。以下Symfonyがインストールされた状態でConfigCacheBundleのセットアップと使い方の手順を示します。インストールConfigCacheBundleを使うインストールConfigCacheBundleをインストールします。composerを使ってバンドルを入手します。yahoojapan/config-cache-bundleAppKernel.phpにConfigCacheBundleを追記してバンドルを有効にします。}}ConfigCacheBundleを使うSymfonyのバンドルを1つ作成しておきます。--format=ymlキャッシュしたい設定ファイルを用意します。Dumars次にExtension、Bundleの各クラスでキャッシュ生成の準備をします。cache:warmupキャッシュされた設定ファイルの内容を参照できるようになります。}}キャッシュファイルはSymfonyのキャッシュディレクトリ配下にPHPファイルとして生成されます。使い方で登場したConfigCacheBundleの主なクラスの役割を紹介します。Register:SymfonyのサービスコンテナにConfigCacheサービスなどを登録するConfigCache:設定ファイルのロード、キャッシュ生成、参照を行うFileResource:ファイルパスなどのリソース関連の情報を持つ高度な使い方ConfigCacheBundleでは使い方で示したような基本的な使い方以外にも付加的な機能を用意しています。設定ファイルの内容を加工してからキャッシュしたいケースはよくあると考えられます。ConfigCacheBundleではデフォルトで用意してある設定ファイルローダを差し替えることで、設定ファイルのロード後にキャッシュ生成前の事前処理をはさむことができ、内容を加工した状態でキャッシュできます。事前処理のタイミングは以下のように設定ファイルのロードとキャッシュファイル生成の間です。設定ファイルのロードはYamlFileLoaderが担います。事前処理はYamlFileLoaderが内部で保持するArrayLoaderが担います。デフォルトではYamlFileLoaderはArrayLoaderを保持していませんので、キャッシュ生成前の事前処理を行いたいときはYamlFileLoaderにArrayLoaderをセットするYamlFileLoaderを別途サービスとして登録するという手順が必要です。ローダの差し替え事前処理をするための実際の例を追ってみます。ArrayLoaderを実装します。}}これをAcmeDemoBundleでサービスにします。['@acme_demo.array_loader']]Bundle::boot()でキャッシュ生成前にローダを差し替えます。}}これでconfig.acme_demo.sampleサービスはArrayLoaderによる置き換え後の配列を持った状態になります。前述のサンプルは単純な例ですがTranslatorとArrayLoaderを組み合わせて、設定ファイル上の翻訳IDをもとに翻訳済みの文字列にしてキャッシュさせることもできます。以下のように設定ファイルをもとにlocaleごとのキャッシュファイルを生成するイメージです。詳しくは多言語対応のドキュメントに実装例がありますのでそちらもご参照ください。複数ファイルのマージ、バリデーションSymfonyのConfigコンポーネントを使って複数ファイルのマージ、バリデーションの機能を実装しています。}}マージされた内容を参照できるようになります。}}設定ファイルのバリデーションはConfigurationで定義された内容が適用されます。設定ファイルのマージを許可する/しないの指定や値の型指定などができます。Configurationは本来はアプリケーション設定app/config/config.ymlをSymfonyのバンドル上で参照する際に、設定値をバリデーションするために用意されたものですが、それを通常の設定ファイルにも適用できるようにしています。ConfigurationについてはSymfonyのドキュメントに詳細が記載されていますのでそちらをご参照ください。私が所属しているチームではプロモーション広告の広告管理ツール(下図)のフロントエンドの開発、保守を行っています。広告管理ツールは2011年にリリースされたもので、今でも現役で稼働しています。リリースからこれまでの間さまざまな機能追加がされていますので内部のコードはかなり複雑になっています。コード自体古くレガシーになりコードのメンテナンスにコストがかかる状態になっていました。このような問題を解消するために1年ほど前から刷新プロジェクトが立ち上がり、現行システムを廃止して基盤プラットフォームをのせかえる対応に取り組みはじめました。新しい基盤プラットフォームではサーバーサイドのフレームーワークとしてSymfony2を採用し、今回公開したConfigCacheBundleはこのプラットフォームの一部として開発されました。ConfigCacheBundleは広告管理ツールの新しいプラットフォームで実際に稼働しはじめています。開発の理由ConfigCacheBundleを開発した理由は単純でSymfony上で設定ファイルをキャッシュするための柔軟な仕組みがなかったためです。Symfonyにはパラメータがありこれを用いて設定ファイルキャッシュを実現する方法も考えられますが、以下のような扱いづらいケースが出てきます。事前処理をするためにサービスが使えないパラメータに対して事前処理をはさむタイミングとしてはExtension::load()またはCompilerPass::process()があります。CompilerPass::process()ではサービスコンテナが未完成のためサービスを自由に使えない制約があります。サービスを差し替えて事前処理の挙動を柔軟に変更したかったのでパラメータでは対応しづらい問題がありました。メモリ消費の問題パラメータはSymfonyのサービスコンテナの中に直接定義されるためパラメータの容量はそのままサービスコンテナにも加わることになります。ファイル数が多くなったり容量の大きいファイルをパラメータとして定義するとサービスコンテナも大きくなります。Symfonyを使う際はサービスコンテナは必ずロードされるため、使わない設定であってもメモリに置かれることになり結果的に無駄なメモリを消費してしまいます。広告管理ツールでは容量の大きい設定ファイルを扱うケースもありましたのでパラメータとは別で管理しようと考えました。応用例で少し触れましたが、設定ファイル上の翻訳IDを事前に翻訳してキャッシュしたいという目的がありました。広告管理ツールでは日本語/英語の多言語対応をするために、設定ファイルに翻訳IDを持っておいてそれを翻訳するケースがよくあります。現行システムではリクエストのたびに都度翻訳をしていましたが、これを事前に翻訳しておいてキャッシュできれば都度翻訳は不要ですので処理速度を速めることができます。そのため事前処理のしやすい設定ファイルキャッシュの仕組みが必要でした。まとめ今回はConfigCacheBundleの紹介として簡単な使い方、機能、開発の経緯について説明しました。Symfonyを使っている開発者にとって役に立つバンドルですのでぜひ使ってみてください。ご意見やご要望、バグ修正など随時受け付けていますのでgithubでご報告いただければと思います。JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。JAPANのサービス開発を支える技術やデザイン、文化を発信しています。Reserved.このページの先頭へ。