Универсальный файл конфига проекта.

Wicked

Новичок
Универсальный файл конфига проекта.

Чего имеем: имеем некий проект и 2 разных хостинга (development и production). При аплоаде с development на production приходится отдельно заботиться о конфигах.

Чего хочется: универсальный файл конфига, который будет работать работать на некотором заранее известном наборе хостингов.

Текущая реализация: По переменным $_SERVER, $_ENV принимаем решение, на каком хостингемы работаем:
PHP:
  function current_server() {
    $servers["dev"] = 0; //normal priority
    $servers["dev"] += (@$_SERVER["SERVER_NAME"] == "192.168.1.178");
    $servers["dev"] += (@$_ENV["CONSOLE"] == "/dev/console");
    $servers["dev"] += (@$_SERVER["SERVER_SOFTWARE"] == "Apache/2.0.52 (Fedora)");

    $servers["prod"] = 1; //high priority for better stability of the product server
    $servers["prod"] += (@$_SERVER["SERVER_NAME"] == "192.168.1.96");
    $servers["prod"] += (@$_SERVER["SERVER_SOFTWARE"] == "Microsoft-IIS/6.0");
    arsort($servers);
    reset($servers);
    return key($servers);
  }
И далее конфиг выглядит так:
PHP:
  $current_server = current_server();

  ...
  define("UI_IMAGES_WIDTH", 1600); //common settings
  define("UI_IMAGES_HEIGHT", 1200);
  define("UI_IMAGES_SIZE", 200000);

  if ($current_server == "dev") { //hosting specific settings
    define("USER_DB_HOSTNAME", "...1...");
    define("USER_DB_LOGIN", "...2...");
    define("USER_DB_PASSWORD", "...3...");
    define("USER_DB_NAME", "...4...");
  }
  if ($current_server == "prod") {
    define("USER_DB_HOSTNAME", "...5...");
    define("USER_DB_LOGIN", "...6...");
    define("USER_DB_PASSWORD", "...7...");
    define("USER_DB_NAME", "...8...");
  }
  ...
PS: Таким образом убивается еще один заяц - то что оба конфига на виду и их проще синхронно редактировать.

Есть идеи, как улучшить этот метод? Или может альтернативные предложения?
 

BOJIK

Новичок
Re: Универсальный файл конфига проекта.

Wicked
а если версия апача измениться на девелопменте или продакшене IP адреса изменются?

с девелопментом понятно - твоя вотчина, а вот с продакшеном будут ли тебя админы уведомлять что ипак изменился?

я обычно привязываюсь только к $_SERVER['HTTP_HOST'] и привязываюсь только для девелоперского. Соотвественно если не девелоперский хост или empty($_SERVER['HTTP_HOST']), то продакшен со своими настройками и не надо городить огород как у тебя.
 

Wicked

Новичок
Re: Re: Универсальный файл конфига проекта.

Автор оригинала: BOJIK
Wicked
а если версия апача измениться на девелопменте или продакшене IP адреса изменются?...
BOJIK, ну скажем так, что даже если не будет ни одного совпадения для обоих серверов, то production победит development'а со счетом 1:0 :)
PHP:
$servers["dev"] = 0; //normal priority
$servers["prod"] = 1; //high priority for better stability of the product server
-~{}~ 06.01.06 13:04:

asm, а у меня - увы. Хотя идея тоже хорошая - подогнать девелопмент сервер под продакшн. Правда, боюсь, полностью это сделать не получится.
 

Гравицапа

elbirret elcno
Wicked
просто сделай два конфига: общий и специфический для сервера (например, настройки доступа к БД).
Соответсвенно на серверах будут лежать свои спец. конфиг + общий
и не надо заморачиваться с определением сервера...
 

neko

tеam neko
Код:
$servers["dev"] += (@$_SERVER["SERVER_SOFTWARE"] == "Apache/2.0.52 (Fedora)"); 
...
$servers["prod"] = 1; //high priority for better stability of the product server 
...
$servers["prod"] += (@$_SERVER["SERVER_SOFTWARE"] == "Microsoft-IIS/6.0");
чума!
 

Wicked

Новичок
Гравицапа, на данный момент так и сделано. Мне же хочется просто забыть про существование конфига на время аплоада и аплоадить проект целиком.

Возвращаясь к предложенному тобой методу вынести эти файлы за пределы директории проекта, есть 2 минуса:
1) файл будет лежать отдельно от проекта и может потеряться или быть стертым другим человеком. Если будут вноситься изменения в хостингоспецифичные части конфига - придется вносить их отдельно.
2) если рядом будет лежать 2 проекта, придется именовать их product_name_db_settings.inc.php, что внесет дополнительные различия между проектами.

-~{}~ 06.01.06 13:31:

neko - в карантин :)

-~{}~ 06.01.06 13:43:

Хотелось бы, чтобы в рамках этой ветки глубокоуважаемые участники форума все-таки думали над проблемой: как сделать автоматическое распознавание хостинга, имея идентичный набор файлов проекта.
 

leonid_p

Новичок
установить уникальную переменную окружения на девелоперском серваке можно?
если можно то по ней и определять.
+ ещё вариант на девелоперском серваке положить в какую-нибудь директорию файл и проверять на его существование...
 

magic

lancer
PHP:
// Set the development configuration parameters - mainly for developers
if (file_exists('includes/devel/configure.php')) include('includes/devel/configure.php');
Поможет?
 

Wicked

Новичок
Итак... наметились 3 источника данных, помогающих понять где мы.
1) обычные переменные окружения типа $_SERVER["SERVER_NAME"], $_SERVER["SERVER_SOFTWARE"]
плюсы: естественность.
минусы: выпадают при смене IP / веб-сервера. Необходимо перебрать несколько вриантов: ip всех интерфейсов + все имена dns.
стабильность (сложность выведения из строя путем смены IP/днс): средняя.
точность (вероятность определения типа хостинга, основываясь на его адресе...): средняя.
2) кастомные переменные окружения.
плюсы:
минусы: может слететь при переконфигурации / переустановке сервера.
стабильность: средняя.
точность: высокая.
3) внешний файл, который проверяется только на существование и необходим только для принятия решения.
плюсы:
минусы: требуется хранение файла за пределами проекта.
стабильность: высокая (при условии, что позаботились о защищенности файла).
точность: высокая.
 

confguru

ExAdmin
Команда форума
По ip адресу выбирать не совсем правильно,
наверняка есть проект.мыкруты.ру
соотвественно strpos на мыкруты.ру
это у нас дев (подключаем dev.conf.php), все остальное продакшен(подключаем conf.php).

внутри
switch ($hostname) {
case 'myproduction.ru':
break;
case 'test.myproduction.ru':
break;
}

В конфиге должно быть все через DEFINE, чтоб было видно везде.

define("UI_IMAGES_WIDTH", 1600); //common settings
лучше использовать CFG_UI_IMAGES_WIDTH - чтоб было понятно где задается эта константа.

Еще несколько полезных дефайн
CFG_SHOW_BANNERS - показ баннеров
CFG_PRODUCTION - это продакшен сервер - не показывать дебаги и прочее
CFG_SHOW_COUNTERS - не показывать счетчики, чтоб враги не узнали девсервера
CFG_APP_ROOT - корень проекта, все остальные дефайнятся от
него, что облегчает конфиг

define("CFG_LIB_PATH", CFG_APP_ROOT.'/lib'); // lib path
 
Сверху