Сложность здесь в том, что разное окружение (доступ к БД, расположение файлов и проч.), будучи «жестко» прописанным в файле конфигурации, заставляет нас постоянно этот файл править. Кроме того, файлы настроек часто заливаются в репозиторий, и после очередного обновления кода у вас всё перестаёт работать.
Для решения проблемы я использовал два метода.
Первый — менее удачный, как мне кажется — заключается в привязке файла конфигурации, либо его части, к имени хоста, на котором запускается проект.
Примерно так выглядел мой XML-конфиг (то, что это XML, не важно — суть та же для любого типа конфигурации).
<?xml version="1.0" encoding="UTF-8"?>
<root>
<!-- You can set just ip or host without "www." -->
<server ip="127.0.0.1" host="localhost">
<!-- Database params -->
<param name="db_host">dm9</param>
<param name="db_port">3307</param>
<param name="db_user">root</param>
<param name="db_pass">123</param>
<param name="db_name">dm9_idsrv</param>
…
</server>
<server ip="12.34.56.78" host="my-production-host.ru">
…
Недостатков у этого метода было 2:
— у разных разработчиков (с разными параметрами окружения) может быть одинаковый хост — скажем, localhost;
— кроме того, при смене или добавлении хоста приходится править файл.
После этого я стал использовать другой метод — переменную окружения, которая указывает, на каком хосте мы сейчас работаем.
Установка переменной окружения проста. Для Апача достаточно добавить строку ‘setEnv DEV_HOST DM9’ в httpd.conf, чтобы создать переменную окружения DEV_HOST, значение которой равно DM9 (имя или ник разработчика). Переменная окружения может быть также установлена отдельно для каждого виртуального хоста. (Кстати, можете подсказать, как это делается под ngix, я добавлю.)
Я предпочитаю устанавливать переменные окружения только для машин, на которых ведётся разработка. Отсутствие такой переменной означает, что мы на «боевом» сервере.
Сейчас мой файл конфигурации (под PHP-проект) выглядит так:
if (isset($_SERVER["DEV_HOST"]) AND $_SERVER["DEV_HOST"] === "DVS") // первый разработчик
{
$config["db_host"] = "localhost";
$config["db_user"] = "root";
$config["db_pass"] = "";
$config["db_name"] = "xtr_ru";
}
elseif (isset($_SERVER["DEV_HOST"]) AND $_SERVER["DEV_HOST"] === "DM9") // второй разработчик
{
$config["db_host"] = "localhost";
$config["db_user"] = "root";
$config["db_pass"] = "123";
$config["db_name"] = "xtr";
}
else // рабочий сервер
{
$config["db_host"] = "localhost";
$config["db_user"] = "xtr";
$config["db_pass"] = "some_password";
$config["db_name"] = "xtr";
}
Опытный читатель заметит, что во всём этом есть один подвох: а как же запускать скрипты из консоли? Это важная задача — например, скрипты нужно уметь запускать планировщиком.
Тут вариантов тоже два — как говорится, на любителя.
Первый — запускать скрипт планировщика с параметром, равным значению хоста (для первого метода из описанных выше) или вашей переменной окружения (для второго метода). Если вы привязываетесь к имени хоста, только этот способ и будет работать.
Вот пример запуска скрипта, на вход которому подаётся имя хоста (содержимое bat-файла, которым я запускаю скрипт из-под Windows):
#clean_something.bat
cd "E:\myproject\utils"
php clean_something.php localhost
pause
(Если Вы используете PHP, параметры, переданные скрипту, можно получить через $_SERVER["argc"] и $_SERVER["argv"].)
Второй вариант — прописать глобальную переменную окружения в операционной системе. В этом случае её не придётся прописывать в файле конфигурации вашего веб-сервера. Под Windows это делается через свойства «Моего Компьютера» (далее закладка Advanced (Подробнее), кнопка Environment Variables (Переменные окружения), далее в разделе System Variables (Системные переменные) кнопка New (Добавить)). Перевод на русский может быть неточным — поправьте, пожалуйста. После этого, скорее всего, придётся перезагрузиться. Под NIX-платформы это делается немного сложнее, и это выходит за рамки данной статьи. Однако, если вы ведёте разработку под Windows, а на NIX выкладывате только релизы, это вам и не понадобится.
Да, почему я пишу эти очевидные для многих строки? Просто мне всё ещё слишком часто приходится работать с проектами, в которых используется один файл конфигурации, не настраиваемый под окружение. Делайте конфиги, которые не надо часто править. Пожалуйста :)