Очень часто по роду деятельности (в креативном агентстве "МЖ") я участвую в дискуссиях по поводу использования той или иной системы управления. Уже не в первый раз мне приходилось в ответ на утверждение, что UMI достаточно гибкий инструмент для разработчика, слышать, что "все сайты в одной базе - это не гибкость". И действительно - одна база на все сайты налагает некоторые ограничения.
Во-первых, все пользователи в системе общие. Это не беда, если сайты не масштабные, но когда речь идет о достаточно посещаемых ресурсах, то тут разделение пользователей становится уже более актуальной проблемой.
Во-вторых, сколько бы гибкой не была система распределения прав, все равно иногда просто невозможно назначить нужные права без возможности не "засветить" объекты, принадлежащие другому сайту (например, баннеры, или места баннеропоказов, или списки рассылок).
В-третьих, салат из различных шаблонов данных иногда тоже весьма не удобен.
Ну и прочие доводы - это уменьшение общей нагрузки на конкретную Базу данных.
В общем, есть несколько досаточно веских причин, для того чтобы разнести базы данных для различных доменов, во всяком случае в некоторых случаях.
Как говорится, все гениальное просто (я на гениальность не претендую, так что не бейте :).
Итак, опишем все поэтапно.
Первое, что нам надо сделать − это дамп "чистой" базы данных, который образуется при первой инсталяции вашей системы на хост. Можно, конечно, взять и не первой свежести, но, если это критично, ее надо будет подчистить от лишних объектов.
Самое главное в этой базе данных - это основной домен и лицензионный ключ... хотя и их конечно можно при желании подредактировать, если нет "нулевой" базы именно от конкретной инсталяции.
Итак, мы имеем дамп "нулевой" БД, создаем на хостинг-аккуанте новую базу для нового сайта и импортируем туда дамп.
Теперь нам надо сделать так, чтобы при запросе конкретного хоста, включалась именно та база данных, которая нам нужна. Делается это очень просто: один из первых файлов, загружаемых системой, - это mysql.php, который содержит настройки подключения к БД. Нам остается его всего лишь немного модифицировать:
- if ($_SERVER['HTTP_HOST'] == 'domain1.ru' || $_SERVER['HTTP_HOST'] == 'www.domain1.ru') {
- $db = 'db_2';
- }
- else {
- $db = 'db_1';
- }
- mysql_connect("mysql.server.ru", "dbu_1", "pass") or die(mysql_fatal());
- mysql_select_db($db) or die(mysql_fatal());
- mysql_query("SET NAMES utf8_general_ci");
- mysql_query("SET CHARSET utf8");
- mysql_query("SET CHARACTER SET utf8");
- mysql_query("SET SESSION collation_connection = 'utf8_general_ci'");
В общем надо просто добавить проверку текущего домена и если домен = domen1.ru или www.domen1.ru, дать соответствующую базу (в условии обязательно надо указать два варианта и все зеркала к домену). А можно еще немного модифицировать, если доменов не один и не два:
- define ("STAT_DISABLE", true);
- switch($_SERVER['HTTP_HOST']) {
- default:
- $db = 'db_1';
- break;
- case 'domain1.su':
- case 'www.domain1.su':
- $db = 'db_2';
- break;
- case 'domain2.ru':
- case 'www.domain2.ru':
- $db = 'db_3';
- break;
- case 'domain3.ru':
- case 'www.domain3.ru':
- $db = 'db_4';
- break;
- case 'domain4.com':
- case 'www.domain4.com':
- $db = 'db_4';
- break;
- }
- mysql_connect("mysql.server.ru", "dbu_1", "pass") or die(mysql_fatal());
- mysql_select_db($db) or die(mysql_fatal());
- mysql_query("SET NAMES utf8_general_ci");
- mysql_query("SET CHARSET utf8");
- mysql_query("SET CHARACTER SET utf8");
- mysql_query("SET SESSION collation_connection = 'utf8_general_ci'")
Теперь для того, чтобы попасть в админку domain2.ru нужно Перейти http://domain2.ru/admin/, а чтобы в админку domain1.su по http://domain1.su/admin/ соответственно, при этом будут вызваны разные базы данных. Можете для каждого сайта делать индивидуальных рутов...да все, что захотите.
Важно: Во всех базах данных основной домен у Вас должен оставаться такой, какой есть, т.е. тот на котором висит лицензия.
Не мудрствуя лукаво можно поступить двумя способами:
- Сделать нужный домен зеркалом основного домена и создавать структуру не обращая внимания на название домена.
- Создать новый сайт в админке.
Вот и все.
А, нет, вру, есть еще один момент: в базах домены могут быть под одинаковыми 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 надо будет доработать.
Надеюсь, моя статья кому-нибудь поможет ;)
Комментирование доступно только авторизованным пользователям.
Пожалуйста, зарегистрируйтесь или войдите на сайт.
Номер билда хранится в базе.
Единственное, лучше всего сохранять файлы и занова восстанавливать их при обновлении каждой базы.
промахнулся:(
вот за это спасибо, очень ценно!!!
есть ли еще подобные хитрости ускорения?
НО ПРОБЛЕМУ ЭТО ОБХОДИТ! А не решает!
Я устал рассказывать, что в серьезной системе НУЖЕН ЧЕЛОВЕЧИЙ (уважающий себя) СПОСОБ ОБРАБОТКИ БАЗОВЫХ ФУНКЦИЙ ЯДРА.
Выгрузка домена, импорт домена. Самое главное - что это даже в этой системе БД ЛЕГКО ДОСТРАИВАЕТСЯ без особых проблем (новый домен строить в новой таблице).
Неужели придется самому дописывать эту надстройку?
PS
Обновления в таком случае ставятся под удар!
А кому это надо? ЮМИ полагает, что это мудро, но на деле само себя СЕЧЕТ давжды - не давая мультидоменность усложняет работу, а кто это обошел -не будет стремиться к апдейту (ладно 10 - за 50%,). Т.е. получаем с двух сторон отфутболивание. Самое смешное -невыгодное и ЮМИ (мимо денег) и нам (не комфортно). Рубяты - ну кто-нибудь объясните уже за меня (мне надоело.)
жаль, что ответов нет.
Неправилен такой подход