27.08.2009 | 14:01

Очень часто по роду деятельности (в креативном агентстве "МЖ") я участвую в дискуссиях по поводу использования той или иной системы управления. Уже не в первый раз мне приходилось в ответ на утверждение, что UMI достаточно гибкий инструмент для разработчика, слышать, что "все сайты в одной базе - это не гибкость". И действительно - одна база на все сайты налагает некоторые ограничения.

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

Во-вторых, сколько бы гибкой не была система распределения прав, все равно иногда просто невозможно назначить нужные права без возможности не "засветить" объекты, принадлежащие другому сайту (например, баннеры, или места баннеропоказов, или списки рассылок).

В-третьих, салат из различных шаблонов данных иногда тоже весьма не удобен.

Ну и прочие доводы - это уменьшение общей нагрузки на конкретную Базу данных.
В общем, есть несколько досаточно веских причин, для того чтобы разнести базы данных для различных доменов, во всяком случае в некоторых случаях.
Как говорится, все гениальное просто (я на гениальность не претендую, так что не бейте :).

Итак, опишем все поэтапно.
Первое, что нам надо сделать − это дамп "чистой" базы данных, который образуется при первой инсталяции вашей системы на хост. Можно, конечно, взять и не первой свежести, но, если это критично, ее надо будет подчистить от лишних объектов.
Самое главное в этой базе данных - это основной домен и лицензионный ключ... хотя и их конечно можно при желании подредактировать, если нет "нулевой"  базы именно от конкретной инсталяции.

Итак, мы имеем дамп "нулевой" БД, создаем на хостинг-аккуанте новую базу для нового сайта и импортируем туда дамп.

Теперь нам надо сделать так, чтобы при запросе конкретного хоста, включалась именно та база данных, которая нам нужна. Делается это очень просто: один из первых файлов, загружаемых системой, - это mysql.php, который содержит настройки подключения к БД. Нам остается его всего лишь немного модифицировать:

  1. if ($_SERVER['HTTP_HOST'] == 'domain1.ru' || $_SERVER['HTTP_HOST'] == 'www.domain1.ru') {
  2.   $db = 'db_2';    
  3. }
  4. else {
  5.     $db = 'db_1';
  6. }
  7.  
  8. mysql_connect("mysql.server.ru", "dbu_1", "pass") or die(mysql_fatal());
  9. mysql_select_db($db) or die(mysql_fatal());
  10.  
  11. mysql_query("SET NAMES utf8_general_ci");
  12. mysql_query("SET CHARSET utf8");
  13.  
  14. mysql_query("SET CHARACTER SET utf8");
  15. mysql_query("SET SESSION collation_connection = 'utf8_general_ci'");

В общем надо просто добавить проверку текущего домена и если домен = domen1.ru или www.domen1.ru, дать соответствующую базу (в условии обязательно надо указать два варианта и все зеркала к домену). А можно еще немного модифицировать, если доменов не один и не два:

  1. define ("STAT_DISABLE", true);
  2.   switch($_SERVER['HTTP_HOST']) {
  3.     default:
  4.            $db = 'db_1';
  5.     break;
  6.  
  7.      case 'domain1.su':
  8.     case 'www.domain1.su':
  9.       $db = 'db_2';
  10.     break;
  11.     
  12.     case 'domain2.ru':
  13.     case 'www.domain2.ru':
  14.       $db = 'db_3';    
  15.     break;
  16.  
  17.     case 'domain3.ru':
  18.     case 'www.domain3.ru':
  19.          $db = 'db_4';  
  20.     break;
  21.     
  22.     case 'domain4.com':
  23.     case 'www.domain4.com':
  24.          $db = 'db_4';  
  25.     break;
  26.     
  27.     
  28.   }
  29.  
  30.   mysql_connect("mysql.server.ru", "dbu_1", "pass") or die(mysql_fatal());
  31.   mysql_select_db($db) or die(mysql_fatal());
  32.  
  33.   mysql_query("SET NAMES utf8_general_ci");
  34.   mysql_query("SET CHARSET utf8");
  35.  
  36.   mysql_query("SET CHARACTER SET utf8");
  37.   mysql_query("SET SESSION collation_connection = 'utf8_general_ci'")

 

Теперь для того, чтобы попасть в админку domain2.ru нужно Перейти http://domain2.ru/admin/, а чтобы в админку domain1.su по http://domain1.su/admin/ соответственно, при этом будут вызваны разные базы данных. Можете для каждого сайта делать индивидуальных рутов...да все, что захотите.

Важно: Во всех базах данных основной домен у Вас должен оставаться такой, какой есть, т.е. тот на котором висит лицензия.

Не мудрствуя лукаво можно поступить двумя способами:

  1. Сделать нужный домен зеркалом основного домена и создавать структуру не обращая внимания на название домена.
  2. Создать новый сайт в админке.

 

Вот и все.

 

А, нет, вру, есть еще один момент: в базах домены могут быть под одинаковыми ID-шниками и из-за этого происходит такой глюк. Например, при показе второго домена, показываются мета-данные первого.
Все из-за того, что эти данные кэшируются классом regedit (или как он там не помню). В общем, лечится тоже достаточно просто:

идем в папку classes/systemCore/regedit/regedit.php
Строка 19: protected function __construct($useFileCache = true) правим на protected function __construct($useFileCache = false)

Возможно, это как-то влияет на производительность системы в целом, но я не заметил разницы, к тому же есть очень полезная фишка для ускорения UMI минимум на треть - это отключение статистики. Опять же в файле mysql.php в любом месте ставим строку define ("STAT_DISABLE", true);

К вышесказанному добавлю, что изменения в в файле  regedit.php будут затерты при обновлении системы через модуль "Автообновление".

Ну, и насколько мне известно, в релизе 2.8 схема подключения к БД несколько изменится, поэтому данный метод, скорее всего, для 2.8 надо будет доработать.

Надеюсь, моя статья кому-нибудь поможет ;)

Читайте также:

Категории

Теги

exchange 28 Обмен данными 1C Интеграция с 1С версии UMICMS технологии модуль хостинг юмихост umihost UMI партнеры продукты UMI мероприятия UMICMS рейтинг MySQL разделение баз данных Кейсы обзоры маркетинг developer программинг менеджмент xslt документация шаблоны Служба Заботы маркетинг веб студии москва UMISummit события umisummit лицензии новинки UMI Edu UMI Cloud business облако тегов кастомы uwdc Челябинск разработчики конференция Конкурс UMIRU видео flash actionscript каталог анимация техподдержка tpl local scope macro кейсы итоги года SAPE seo мероприятие рынок веб разработки экономика Алексей Самойлов Сергей Котырев KINETICA CMS Сибирская интернетнеделя UMIWorkshop интернетмагазин интернет-магазин интернет магазин интернет-маркетинг акция Золотой сайт umi_workshop партнерская_программа партнерство стратегия highload РуПромо Машков версия 2_7 кэширование скорость стихи день рождения статьи пресс конференция версия 2_5 Edit_in_Place онлайн платежи кризис достижения CeBIT внедрения umi cms блоги верстка релиз EditInPlace изучение Юми создание модуля модули ReMIX UMI_CMS_Net iPhone XML драйвер как убрать лампочку форма обратной связи языковые версии CMS Pistols музыка UMICMS 28 удобство юзабилити usability user experience интерфейсы CMS Eye tracking ай тракинг usability test UXRussia управление сайтом RIW Russian internet week Softool выставки интернет клиенты сайты umisound cms pistols РИФ 2011 Tagline качество 2012 UMISound Полюса Илья Разин Марат Машков

Авторы блога