zf2のモジュールコンフィグのキャッシュ

zf2のアプリケーション、サービス、Diやモジュール用設定は毎回、ほぼ同じ設定を読み込みます。複数のファイルへ毎回アクセスしてマージするのももったいないので、簡単にキャッシュする方法が用意されています。(※ベンチを取るならせめてこのくらいのことはやって欲しいです。ページキャッシュのようにベンチを無意味にするキャッシュではないので。)
https://github.com/zendframework/ZendSkeletonApplication/blob/master/config/application.config.php
ケルトンアプリの設定にもあるように、コンフィグのキャッシュを有効にします。
'config_cache_enabled' => true,
'config_cache_key' => '123',
'cache_dir' => 'data/cache',
'module_map_cache_enabled' => true,
'module_map_cache_key' => '456',
たとえば、上記のkey値を別ファイルにしてディプロイ時に更新されるようにするとか、キャッシュファイルを消すなどで更新されるようにしておけばOKですね。
key値を更新していく方法なら、古いキャッシュファイルが残ってしまいますが。
さて、稀にglobalコンフィグで、サービス定義を無名関数で与えている場合に、上記した、var_exportの問題にはまることになります。
この点、すでにissueに上がっているようなんですが、closeされていますね。
https://github.com/zendframework/zf2/issues/2697

対策1:素直にFactoryクラスを使う

サービス設定では、Factoryを用意するというのが王道だろうと思います。

対策2:無名関数をserializableでラップする

上記した、serializableにする工夫を施せばグローバルに使えますが・・・

対策3:設定ファイル中のClosureは、モジュール側へ移すと解決されるという説

https://github.com/SpoonX/SxBootstrap/pull/9
モジュール内で、getConfigで読まれた設定はキャッシュされますが、Module::getServiceConfigで読まれた設定は、ロード後に読まれるようです。そのため、getServiceConfig側でClosureを使う分にはキャッシュしないので問題は生じません。
この仕様が意図的なものかどうかはわかりません(testされていない)ので、この方法を取る場合は自前でテストを追加してフレームワークの更新時にチェックする必要がありそうです。