Форум → Программирование → Пыхнуть хотите? → F.A.Q. → Конфигурация сайта
Конфигурация сайта
-
30 июля 2011 г. 21:08, спустя 182 дня 2 часа 13 минут
Сегодня заведём разговор на такую, казалось бы простую, тему, как конфигурация сайта. То есть поговорим о таких вещах, как параметры подключения к БД, различные настройки, как всё это хранить и как со всем этим работать.
1: Введение
2.1: Совместная разработка (платформы)
2.2: Совместная разработка (наследование)
Конфигурация сервера -
26 января 2011 г. 15:17, спустя 19 часов 8 минут 22 секунды
пля, тебе нужно идти преподавать! :) Ты так аухенно пишешь ) -
26 января 2011 г. 15:34, спустя 17 минут 49 секунд
1. Нет никакой "конфигурации сайта", есть конфигурации инстансов объектов. Соответственно поля конфига группируем по инстансам:
db1:
host: hostname
user: username
db2:
host: host2name
user: user2name
auth:
mode: strict
check_cookies: true
allow_users: [alice, bob, cheburashka]
2. соответственно когда создаём инстанс объекта загружаем в него ветку из конфига из файла:
$config_object = new X_Config($config_file, '/db1');
$model_instance = new $model_classname($config_object);
3. В самом инстансе доступ к свойствам конфига получаем так:
$host = $this->config['/host']; // это не массив, а объект с имплементацией ArrayAccess
$user = $this->config['/user'];
$auth_users = $this->config['/allow_users'];
4. Используем ArrayAccess потому что это просто удобнее.
5. Можем поиметь при необходимости весь конфиг
$config_object = new X_Config($config_file, '/');
$model_instance = new $model_classname($config_object);
…
$host = $this->config['/db1/host'];
$auth_users = $this->config['/auth/allow_users'];
но как правило такое не нужно, т.к. удобнее работать с изолированными ветками
6. Для наложения индивидуальных настроек на общие удобно использовать array_replace_recursive (к сожалению только в 5.3, в 5.2 приходится её переписывать вручную).не всё полезно, что в swap полезло -
26 января 2011 г. 17:47, спустя 2 часа 12 минут 54 секунды
Нет никакой "конфигурации сайта", есть конфигурации инстансов объектов.
Если имеется отличное мнение, не следует начинать его изложение с "нет никакой"… Я считаю что есть, даже если в системе нет вообще никаких объектов. Что есть инстанс объекта? Объект сам инстанс.соответственно когда создаём инстанс объекта загружаем в него ветку из конфига из файла:
Объекты должны знать что-то о конфиге? -
26 января 2011 г. 18:11, спустя 23 минуты 25 секунд
Что есть инстанс объекта? Объект сам инстанс.
агаОбъекты должны знать что-то о конфиге?
только о своей маленькой ветке и её структуре. для объекта бд конфиг выглядит как
array('host' => …, 'user' => … )не всё полезно, что в swap полезло -
26 января 2011 г. 18:17, спустя 5 минут 58 секунд
7. практика показывает что вот эти ситуации
$dir_root = '/www/site.ru/htdocs';
$dir_image = $dir_root.'/image';
$dir_thumbs = $dir_image.'/thumbs';
$dir_css = $dir_root.'/css';
лучше разруливать всё же прямым указанием значений
$dir_root = '/www/site.ru/htdocs';
$dir_image = '/www/site.ru/htdocs/image';
$dir_thumbs = '/www/site.ru/htdocs/image/thumbs';
$dir_css = '/www/site.ru/htdocs/css';
т.к. отдельная сложность конфигов - решить какие параметры объявить первичными, а какие вторичными на основе первичных.
либо
8. отдельно объявляем константы, а на основе констант уже формируем значения конфига
constants.php
define('DIR_ROOT', '/www/site.ru/htdocs');
config.php
return array(
'dir_image' => DIR_ROOT.'/image',
'dir_thumbs' => DIR_ROOT.'/image/thumbs',
'dir_css' => DIR_ROOT.'/css',
)не всё полезно, что в swap полезло -
26 января 2011 г. 18:20, спустя 3 минуты 14 секунд
По первой части:
Мне хватает глобального маccива $CONF. Т.е. использую способ, который в статье называется "Массивчик". С ретурном из инклюда способ порадовал, я честно говоря не то чтобы не знал, но как-то не думал что можно найти практическое применение возвращаемого значения из инклюда. А вот все навороты с классами, ИМХО - навороты ради наворотов, не вижу существенных приемуществ.
По второй части:
У меня всегда есть отдельный conf в котором храняться настройки, которые теоритически могут отличаться на девелопменте и продакшене. На самомо деле, таких настроек крайне мало и меняются они редко, коннект к базе из их числа. Этот файл один раз правится на продакшене руками и больше его никто не трогает, кроме ведущего программиста. Если кто выложит - получает пизды (или автоматом исключаем его из комитов). Неэстетично, зато дешево и практично. Остальные конфы должны синхронизироваться между разработчиками так же как и остальные части проекта. -
26 января 2011 г. 18:21, спустя 1 минуту 4 секунды
Этот файл один раз правится на продакшене руками и больше его никто не трогает, кроме ведущего программиста. Если кто выложит - получает пизды.
конфиг добавляется в игнор деплой-скрипта
либо если деплой делается через свн-ап то изменённые на сервере строки остаются изменёнными, а закоммиченные изменения мерджатся в рабочей копии на серверене всё полезно, что в swap полезло -
-
26 января 2011 г. 19:22, спустя 55 минут 39 секунд
7. практика показывает что вот эти ситуации
$dir_root = '/www/site.ru/htdocs';
$dir_image = $dir_root.'/image';
$dir_thumbs = $dir_image.'/thumbs';
$dir_css = $dir_root.'/css';
лучше разруливать всё же прямым указанием значений
$dir_root = '/www/site.ru/htdocs';
$dir_image = '/www/site.ru/htdocs/image';
$dir_thumbs = '/www/site.ru/htdocs/image/thumbs';
$dir_css = '/www/site.ru/htdocs/css';
Моя практика показывает что синхронизировать несколько копий с подобным прямым указанием крайне сложно.8. отдельно объявляем константы, а на основе констант уже формируем значения конфига
На любой крупной системе желательно избавляться от всех глобальны переменных, констант и лишних высокоуровневых связей.Спустя 95 сек.Неэстетично, зато дешево и практично.
Ну, мы же здесь об эстетике говорим :) -
26 января 2011 г. 20:00, спустя 38 минут 45 секунд
На любой крупной системе желательно избавляться от всех глобальны переменных, констант и лишних высокоуровневых связей.
констант минимум и они используются только для задания значений конфиговне всё полезно, что в swap полезло -
26 января 2011 г. 20:20, спустя 19 минут 25 секунд
Чем конфиг отличается от других подсистем? Почему ему такая честь, иметь константы, которые другим запрещены? -
27 января 2011 г. 7:22, спустя 11 часов 2 минуты 21 секунду
догматическое программирование на пыха.руне всё полезно, что в swap полезло -
27 января 2011 г. 7:54, спустя 31 минуту 30 секунд
Очень понравилось что написал vasa_c и как написал тоже понравилось.
Сам пришел практически к таким же схемам. Опишу то что имею сверх описанного.
1. Абсолютно не принципиально в каком формате конфиг лежит на диске - после подгрузки это все-равно будет ветвистый ассоциативный массив типа дерево. :) Соответственно объединение глобального и частного конфигов выполняется через array_merge_recursive() - то что надо перекроется.
2. Про разграничение доступа к разделам конфигурации. Есть закрытый раздел конфига (назовем его "rules"), данные из него могут попасть в компоненту только при создании - Dependency Injection. Я завёл базовый класс "компонента" с таким вот конструктором:
class Component
{
public function __construct(array $params = NULL)
{
if (!empty($params)) {
foreach ($params as $var => $value) {
$this->$var = $value;
}
}
}
}
А в закрытом разделе конфига описывается чем инициируется компонент:
return array(
'rules' => array(
'A' => array('class'=>'MyComponentClassA', 'host'=>'192.168.12.13', 'user'=>'benaflek', 'password'=>'hujnane'),
'B' => array('class'=>'MyComponentClassB', 'path'=>'/subdir/xxx.dat'),
)
)
Сам класс конфигурации, очевидно, имеет доступ к своим данным. Процесс создания объекта в фабрике-конфиге:
$args = self::$_rules[$name];
$class = $args['class'];
unset($args['class']);
return new $class($args); // $class inherits from Component !ιιlllιlllι унц-унц -
27 января 2011 г. 8:16, спустя 22 минуты 12 секунд
Соответственно объединение глобального и частного конфигов выполняется через array_merge_recursive() - то что надо перекроется.
ветки без ключей (или с цифровыми ключами) не перекроются а дублируются. использовать надо array_replace_recursiveне всё полезно, что в swap полезло
Пожалуйста, авторизуйтесь, чтобы написать комментарий!