In software development life cycle, we generally need different type of environments for different purpose like – “development”, “testing”, “production” etc.
And all these environments has some environment specific configuration. like in development server “display error” will be on and payment mode will be “testmode” But in production server “display error” will be off and payment mode will be “livemode” In production server error logging will be on but in testing server it may not be on. Database connection will be different for each environment. etc etc…
Problem:
Its been a big headache to server management team to modify configuration files each time code update to any server.
Here we have created multiple configuration files for each server and automatically loaded environment wise configuration file using “zend-framework”.
Solution:
Here we will consider 3 environment- “Production”, “QA” and “Development” in order to explain the process.
So we will create 4 ini files:
common_config.ini: to keep common configuration (which don’t change with environments)
app_prod.ini: “Production” server specific configuration
app_QA.ini: “QA” server specific configuration
app_dev.ini: “Development” server specific configuration
common_config.ini:
[Production] phpSettings.error_log = [path to file] "/application.log" includePaths.application = APP_PATH includePaths.library = APP_LIB bootstrap.path = [path to file] "/Bootstrap.php" bootstrap.class = "Project_Bootstrap" autoloadernamespaces.0 = "Project" resources.frontController.moduleControllerDirectoryName = "controllers" resources.frontController.moduleDirectory = [path to file] "/modules" resources.frontController.defaultControllerName = "index" resources.frontController.defaultAction = "index" resources.frontController.defaultModule = "account" [QA : Production] [Development : Production]
Look at last 2 lines- it is saying QA and Development server both will extend configuration from Production.
app_prod.ini:
[Production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 phpSettings.log_errors = 1 ;payment related credentials payment.mode = "liveMode" ;db configuration resources.db.adapter = "Pdo_Mysql" resources.db.params.host = "localhost" resources.db.params.username = "user1" resources.db.params.password = "pass1" resources.db.params.dbname = "db_prod"
app_QA.ini:
[QA] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 phpSettings.log_errors = 1 ;payment related credentials payment.mode = "testMode" ;db configuration resources.db.adapter = "Pdo_Mysql" resources.db.params.host = "localhost" resources.db.params.username = "user2" resources.db.params.password = "pass2" resources.db.params.dbname = "db_qa"
app_dev.ini:
Similar to QA. you now know what will be in this configuration file. 🙂
So we made ready all configuration files. Now need to load proper configuration for environments.
index.php file will contain something like this:
defined('COMMON_CONFIG_INI_PATH') || define('COMMON_CONFIG_INI_PATH', [path to file] . '/Config/common_config.ini'); // set APP_INI_PATH according to environment switch (APP_ENV) { case 'Production' : defined('APP_INI_PATH') || define('APP_INI_PATH', [path to file] . '/Config/app_prod.ini'); break; case 'QA' : defined('APP_INI_PATH') || define('APP_INI_PATH', [path to file] . '/Config/app_QA.ini'); break; case 'Development' : defined('APP_INI_PATH') || define('APP_INI_PATH', [path to file] . '/Config/app_dev.ini'); } defined('APP_LOG_PATH') || define('APP_LOG_PATH', realpath(dirname(__FILE__) . '/../logs')); //Bootstrap the application require_once('Zend/Application.php'); //load zend_app with config file and run $application = new Zend_Application(APP_ENV, array( 'config' => array( COMMON_CONFIG_INI_PATH, APP_INI_PATH ) ) ); $application->bootstrap()->run();
So here we we have set 2 constant for configuration files according to environment: COMMON_CONFIG_INI_PATH and APP_INI_PATH
and loaded these 2 configuration while bootstrapping.
You are done. Nothing more. Simple, isn’t it? 🙂