ФорумПрограммированиеПыхнуть хотите?F.A.Q. → Конфигурация сайта

Конфигурация сайта

  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 30 июля 2011 г. 13:08, спустя 182 дня 2 часа 13 минут

    Сегодня заведём разговор на такую, казалось бы простую, тему, как конфигурация сайта. То есть поговорим о таких вещах, как параметры подключения к БД, различные настройки, как всё это хранить и как со всем этим работать.

    1: Введение
    2.1: Совместная разработка (платформы)
    2.2: Совместная разработка (наследование)

    Конфигурация сервера
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 26 января 2011 г. 7:17, спустя 19 часов 8 минут 22 секунды

    пля, тебе нужно идти преподавать! :) Ты так аухенно пишешь )
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 26 января 2011 г. 7: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 полезло
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 26 января 2011 г. 9:47, спустя 2 часа 12 минут 54 секунды

    Нет никакой "конфигурации сайта", есть конфигурации инстансов объектов.

    Если имеется отличное мнение, не следует начинать его изложение с "нет никакой"… Я считаю что есть, даже если в системе нет вообще никаких объектов. Что есть инстанс объекта? Объект сам инстанс.

    соответственно когда создаём инстанс объекта загружаем в него ветку из конфига из файла:

    Объекты должны знать что-то о конфиге?
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 26 января 2011 г. 10:11, спустя 23 минуты 25 секунд

    Что есть инстанс объекта? Объект сам инстанс.

    ага

    Объекты должны знать что-то о конфиге?

    только о своей маленькой ветке и её структуре. для объекта бд конфиг выглядит как
    array('host' => …, 'user' => … )
    не всё полезно, что в swap полезло
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 26 января 2011 г. 10: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 полезло
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 26 января 2011 г. 10:20, спустя 3 минуты 14 секунд

    По первой части:

    Мне хватает глобального маccива $CONF. Т.е. использую способ, который в статье называется "Массивчик".  С ретурном из инклюда способ порадовал, я честно говоря не то чтобы не знал, но как-то не думал что можно найти практическое применение возвращаемого значения из инклюда. А вот все навороты с классами, ИМХО - навороты ради наворотов, не вижу существенных приемуществ.

    По второй части:

    У меня всегда есть отдельный conf в котором храняться настройки, которые теоритически могут отличаться на девелопменте и продакшене. На самомо деле, таких настроек крайне мало и меняются они редко, коннект к базе из их числа. Этот файл один раз правится на продакшене руками и больше его никто не трогает, кроме ведущего программиста. Если кто выложит - получает пизды (или автоматом исключаем его из комитов). Неэстетично, зато дешево и практично. Остальные конфы должны синхронизироваться между разработчиками так же как и остальные части проекта.

  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 26 января 2011 г. 10:21, спустя 1 минуту 4 секунды

    Этот файл один раз правится на продакшене руками и больше его никто не трогает, кроме ведущего программиста. Если кто выложит - получает пизды.

    конфиг добавляется в игнор деплой-скрипта
    либо если деплой делается через свн-ап то изменённые на сервере строки остаются изменёнными, а закоммиченные изменения мерджатся в рабочей копии на сервере
    не всё полезно, что в swap полезло
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 26 января 2011 г. 10:26, спустя 5 минут 2 секунды

    В рабочей копии тоже запрещаем.
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 26 января 2011 г. 11: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 сек.
    Неэстетично, зато дешево и практично.

    Ну, мы же здесь об эстетике говорим :)

  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 26 января 2011 г. 12:00, спустя 38 минут 45 секунд

    На любой крупной системе желательно избавляться от всех глобальны переменных, констант и лишних высокоуровневых связей.

    констант минимум и они используются только для задания значений конфигов
    не всё полезно, что в swap полезло
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 26 января 2011 г. 12:20, спустя 19 минут 25 секунд

    Чем конфиг отличается от других подсистем? Почему ему такая честь, иметь константы, которые другим запрещены?
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 26 января 2011 г. 23:22, спустя 11 часов 2 минуты 21 секунду

    догматическое программирование на пыха.ру
    не всё полезно, что в swap полезло
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 26 января 2011 г. 23: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ι унц-унц
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 27 января 2011 г. 0:16, спустя 22 минуты 12 секунд

    Соответственно объединение глобального и частного конфигов выполняется через array_merge_recursive() - то что надо перекроется.

    ветки без ключей (или с цифровыми ключами) не перекроются а дублируются. использовать надо array_replace_recursive
    не всё полезно, что в swap полезло

Пожалуйста, авторизуйтесь, чтобы написать комментарий!