Bootstrap内ではiniファイルなどの設定ファイルを丁寧にキャッシュやZend_Registryなどに格納して最適化をはかりますが、
どうしてもautoloader用のiniファイルやapplication.iniファイルなどBootstrap内で呼ばれる順番が早いため最適化出来ないファイル群があります。
今回はそんな可哀想な設定ファイルたちの救済措置の一例です。
Zend_Cacheの下準備
Zend_Cache定義のためにフロントエンド、バックエンドオプションを設定します。
$frontendOptions = array( 'name' => 'File', 'params' => array( 'lifetime' => null, 'automatic_cleaning_factor' => 0, 'automatic_serialization' => true, 'master_files' => array( APPLICATION_PATH . "/config/application.ini", APPLICATION_PATH . '/config/autoloader.ini', APPLICATION_PATH . '/config/config.ini' ) ) ); $backendOptions = array( 'name' => 'File', 'params' => array( 'cache_dir' => APPLICATION_PATH . '/tmp/cache/config', ) ); $configCache = Zend_Cache::factory( $frontendOptions['name'], $backendOptions['name'], $frontendOptions['params'], $backendOptions['params'] );
Zend_Cacheの定義
キャッシュが存在しないまたは変更などがおこなわれた場合はキャッシュ化を行います。
$finalConfig = null; if (!($finalConfig = $configCache->load('configuration'))) { $configFiles = array( APPLICATION_PATH . "/config/application.ini", APPLICATION_PATH . '/config/autoloader.ini', APPLICATION_PATH . '/config/config.ini' ); $masterConfig = null; foreach($configFiles as $file) { $config = new Zend_Config_Ini( $file, APPLICATION_ENV, array('allowModifications'=>true) ); if (is_null($masterConfig)) { $masterConfig = $config; } else { $masterConfig->merge($config); } } $finalConfig = $masterConfig->toArray(); $configCache->save($finalConfig, 'configuration'); }
Zend_Applicationの定義
出来上がった$finalConfigをZend_Applicationの第2引数にぶち込んで終了です。とても簡単です
/** * Run the application * Use Zend_Application */ $application = new Zend_Application( APPLICATION_ENV, $finalConfig ); $application->bootstrap()->run();
全ソースコード
/** Zend_Cache */ require 'Zend/Cache.php'; /** Zend_Config_Ini */ require 'Zend/Config/Ini.php'; $frontendOptions = array( 'name' => 'File', 'params' => array( 'lifetime' => null, 'automatic_cleaning_factor' => 0, 'automatic_serialization' => true, 'master_files' => array( APPLICATION_PATH . "/config/application.ini", APPLICATION_PATH . '/config/autoloader.ini', APPLICATION_PATH . '/config/config.ini' ) ) ); $backendOptions = array( 'name' => 'File', 'params' => array( 'cache_dir' => APPLICATION_PATH . '/tmp/cache/config', ) ); $configCache = Zend_Cache::factory( $frontendOptions['name'], $backendOptions['name'], $frontendOptions['params'], $backendOptions['params'] ); $finalConfig = null; if (!($finalConfig = $configCache->load('configuration'))) { $configFiles = array( APPLICATION_PATH . "/config/application.ini", APPLICATION_PATH . '/config/autoloader.ini', APPLICATION_PATH . '/config/config.ini' ); $masterConfig = null; foreach($configFiles as $file) { $config = new Zend_Config_Ini( $file, APPLICATION_ENV, array('allowModifications'=>true) ); if (is_null($masterConfig)) { $masterConfig = $config; } else { $masterConfig->merge($config); } } $finalConfig = $masterConfig->toArray(); $configCache->save($finalConfig, 'configuration'); } /** * Run the application * Use Zend_Application */ require 'Zend/Application.php'; $application = new Zend_Application( APPLICATION_ENV, $finalConfig ); $application->bootstrap(); $application->bootstrap()->run();
他にも色々やり方はあると思いますが、あまり窮屈に考えず緩く考えた場合
このぐらいが基本と言えるのではないでしょうか。