26 апр. 2011 г.

Единый конфигурационный файл для рабочего и тестового сервера проекта ZF на базе Zend_Config и mod_rewrite

Для корректной работы любого проекта необходимо 2 конфигурационных файла: тестовый(для отладки на тестовом сервере) и рабочий(который необходим для работы на рабочем сайте). Zend Framework предоставляет 2 возможных варианта хранения настроек: в формате XML и в формате Ini. В обоих случаях указано, что можно в настройках использовать наследование: [staging : production] - для Zend_Config_Ini и - для Zend_Config_Xml. Данным подходом можно воспользоваться для хранения настроек для тестового и рабочего серверов в одном файле. Для примера возьмем порстой файл с настройками, в котором лежит только конфиг для подклчения к БД:
[production]
db.adapter = "PDO_MYSQL"
db.host = "localhost"
db.port = "3306"
db.username = "user"
db.password = "pass"
db.dbname = "project"

[testing : production]
db.password = "pass1"

 Из данного файла конфигурации следует, что БД на тестовом и рабочем сервере идентичны, кроме пароля для подулючения к оной. Теперь соответственно необходимо сделать так, что б на рабочем сервере происходило подключение к одной БД, а на тестовом - к другой без правки кода подключения к БД. В данном случае нам на помощь приходит модуль сервера Apache - mod_rewrite.
В папке с проектом в файле .htaccess пишем следующее:

##ниже можно перечислислить стандартный наобр переменных, необходимых для инициализации проекта
RewriteRule (.*) - [E=ZF[config]:production, E=ZF[usedb]:1]
## ниже переопределяются переменные, исходя из названия сервера, на котором находится проект
RewriteCond %{HTTP_HOST} ^(.*)project\.test$
RewriteRule (.*) - [E=ZF[config]:testing, E=ZF[usedb]:1]

Исходя из данного конфигурационного файла видно, что если проект не находится на хосте project.test - то будет использован стандартный набор переменных, к которым можно получить доступ через $_SERVER['ZF']. Соответственно в проекте загружать файл конфигурации необходимо следующим образом:

$config = Zend_Config_Ini('/path/to/configs/config.ini', $_SERVER['ZF']['config'], true);

В результате для различных проектов будут загружены различные данные.