Здесь курят мануал.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Мы в твиттере!
Мы вконтакте!
Мы на яндексе!

Краснодарское время: 25 Май, 2012, 10:08:10

Страниц: [1] 2 3 ... 7
Печать
Автор Тема: Конфигурация сайта  (Прочитано 1471 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vasa_c    ↓ 
30 Июль, 2011, 09:08:47
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 81
Сообщений: 2459
Сила слова: 3.29

Сегодня заведём разговор на такую, казалось бы простую, тему, как конфигурация сайта. То есть поговорим о таких вещах, как параметры подключения к БД, различные настройки, как всё это хранить и как со всем этим работать.
 
1: Введение
2.1: Совместная разработка (платформы)
2.2: Совместная разработка (наследование)
 
Конфигурация сервера
« Последнее редактирование: 30 Июль, 2011, 09:08:47 от vasa_c » Записан

mario    ↓ 
26 Январь, 2011, 03:17:09 , спустя
НЕ ХУЕТА! ХУЕТА!

wazzup
Группа: Джедаи

Карма: 67
Сообщений: 6162
Сила слова: 1.09

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

с ув. mario.
Контакты
master    ↓ 
26 Январь, 2011, 03:34:58 , спустя 17 минут 49 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

1. Нет никакой "конфигурации сайта", есть конфигурации инстансов объектов. Соответственно поля конфига группируем по инстансам:
Text

db1:
  host: hostname
  user: username
 
db2:
  host: host2name
  user: user2name
 
auth:
  mode: strict
  check_cookies: true
  allow_users: [alice, bob, cheburashka]
 

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

$config_object = new X_Config($config_file, '/db1');
$model_instance = new $model_classname($config_object);
 

3. В самом инстансе доступ к свойствам конфига получаем так:
 
PHP

$host = $this->config['/host']; // это не массив, а объект с имплементацией ArrayAccess
$user = $this->config['/user'];
 

PHP

$auth_users = $this->config['/allow_users'];
 

4. Используем ArrayAccess потому что это просто удобнее.
 
5. Можем поиметь при необходимости весь конфиг
PHP

$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 приходится её переписывать вручную).
« Последнее редактирование: 26 Январь, 2011, 03:33:32 от master » Записан

vasa_c    ↓ 
26 Январь, 2011, 05:47:52 , спустя 2 часа 12 минут 54 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 81
Сообщений: 2459
Сила слова: 3.29

Нет никакой "конфигурации сайта", есть конфигурации инстансов объектов.
Если имеется отличное мнение, не следует начинать его изложение с "нет никакой"... Я считаю что есть, даже если в системе нет вообще никаких объектов. Что есть инстанс объекта? Объект сам инстанс.
 
соответственно когда создаём инстанс объекта загружаем в него ветку из конфига из файла:
Объекты должны знать что-то о конфиге?
Записан

master    ↓ 
26 Январь, 2011, 06:11:17 , спустя 23 минуты 25 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

Что есть инстанс объекта? Объект сам инстанс.
ага
 
Объекты должны знать что-то о конфиге?
только о своей маленькой ветке и её структуре. для объекта бд конфиг выглядит как
array('host' => ..., 'user' => ... )
Записан

KaFe    ↓ 
26 Январь, 2011, 06:15:55 , спустя 4 минуты 38 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Сраный Тролль

Карма: -13346
Сообщений: 1727
Сила слова: -772.79

у меня все на ini-файлах бодяжится, но принцип работы слегка похож на предложенный vasa_c.
Записан

master    ↓ 
26 Январь, 2011, 06:17:15 , спустя 1 минуту 20 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

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',
)
Записан

AlexB    ↓ 
26 Январь, 2011, 06:20:29 , спустя 3 минуты 14 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 89
Сообщений: 3425
Сила слова: 2.6

По первой части:
 
Мне хватает глобального маccива $CONF. Т.е. использую способ, который в статье называется "Массивчик".  С ретурном из инклюда способ порадовал, я честно говоря не то чтобы не знал, но как-то не думал что можно найти практическое применение возвращаемого значения из инклюда. А вот все навороты с классами, ИМХО - навороты ради наворотов, не вижу существенных приемуществ.
 
По второй части:
 
У меня всегда есть отдельный conf в котором храняться настройки, которые теоритически могут отличаться на девелопменте и продакшене. На самомо деле, таких настроек крайне мало и меняются они редко, коннект к базе из их числа. Этот файл один раз правится на продакшене руками и больше его никто не трогает, кроме ведущего программиста. Если кто выложит - получает пизды (или автоматом исключаем его из комитов). Неэстетично, зато дешево и практично. Остальные конфы должны синхронизироваться между разработчиками так же как и остальные части проекта.
 
« Последнее редактирование: 26 Январь, 2011, 06:20:29 от AlexB » Записан

master    ↓ 
26 Январь, 2011, 06:21:33 , спустя 1 минуту 4 секунды
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

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

AlexB    ↓ 
26 Январь, 2011, 06:26:35 , спустя 5 минут 2 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 89
Сообщений: 3425
Сила слова: 2.6

В рабочей копии тоже запрещаем.
Записан

vasa_c    ↓ 
26 Январь, 2011, 07:22:14 , спустя 55 минут 39 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 81
Сообщений: 2459
Сила слова: 3.29

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. отдельно объявляем константы, а на основе констант уже формируем значения конфига
На любой крупной системе желательно избавляться от всех глобальны переменных, констант и лишних высокоуровневых связей.
Спустя 1 минуту 35 секунд добавил
Неэстетично, зато дешево и практично.
Ну, мы же здесь об эстетике говорим :)
 
Записан

master    ↓ 
26 Январь, 2011, 08:00:59 , спустя 38 минут 45 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

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

vasa_c    ↓ 
26 Январь, 2011, 08:20:24 , спустя 19 минут 25 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 81
Сообщений: 2459
Сила слова: 3.29

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

master    ↓ 
27 Январь, 2011, 07:22:45 , спустя 11 часов 2 минуты 21 секунду
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

догматическое программирование на пыха.ру
Записан

artoodetoo    ↓ 
27 Январь, 2011, 07:54:15 , спустя 31 минуту 30 секунд
НЕ ХУЕТА! ХУЕТА!

с особым цинизмом
Группа: в ухо

Карма: 124
Сообщений: 3805
Сила слова: 3.26

Очень понравилось что написал vasa_c и как написал тоже понравилось.
Сам пришел практически к таким же схемам. Опишу то что имею сверх описанного.
 
1. Абсолютно не принципиально в каком формате конфиг лежит на диске - после подгрузки это все-равно будет ветвистый ассоциативный массив типа дерево. :) Соответственно объединение глобального и частного конфигов выполняется через array_merge_recursive() - то что надо перекроется.
 
2. Про разграничение доступа к разделам конфигурации. Есть закрытый раздел конфига (назовем его "rules"), данные из него могут попасть в компоненту только при создании - Dependency Injection. Я завёл базовый класс "компонента" с таким вот конструктором:
PHP

class Component
{
    public function __construct(array $params = NULL)
    {
        if (!empty($params)) {
            foreach ($params as $var => $value) {
                $this->$var = $value;
            }
        }
    }
}
 
А в закрытом разделе конфига описывается чем инициируется компонент:
PHP

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'),
  )
)
 
Сам класс конфигурации, очевидно, имеет доступ к своим данным. Процесс создания объекта в фабрике-конфиге:
PHP

$args = self::$_rules[$name];
$class = $args['class'];
unset($args['class']);
return new $class($args); // $class inherits from Component !
 
Записан
Страниц: [1] 2 3 ... 7
Печать
 

Перейти в:  

Этот топик скрыли: adw0rd, Sinkler, Frozzeg