2011-01-21 2 views
0

Я пытаюсь изменить который DB соединение используют в зависимости от ряда условий внутри пользовательского модуля крюком, метко названный mymodule_init()Drupal 7 db_set_active() в mymodule_init()?

hook_init(), казалось логичным девать эту функцию, потому что это называется так рано в загрузчике игры, перед любыми запросами БД ???

Таким образом, у меня есть несколько соединений в пуле, а один из них определяется модулем. В течение жизни я не могу заставить систему упорствовать в БД - кажется, она возвращается к «умолчанию» после выполнения этого крючка. Поиск кодовой базы малоэффективен, и только один или два вызова db_set_active().

ЛЮБЫЕ идеи? Какую ошибку я должен переопределить для изменения соединения БД во время выполнения до того, как будет выполнена какая-либо операция БД ???

Приветствия, Alex

ответ

1

Чуть hook_init «в начале игры» и, конечно, не первый огонь запросов к базе данных. Порядок загрузки: конфигурация загрузки, попытка обслуживать страницу из кеша, инициализировать базу данных, загружать переменные, загружать сеанс, заголовок страницы. Первый перехватчик - hook_boot либо в случае, если в кеше страницы есть попадание, либо в заголовке страницы - к тому времени, по крайней мере, фаза инициализации переменных инициировала запрос либо для загрузки переменных из базы данных (или для извлечения их из кеша, но для вас не может полагаться на кеш, а кеш по умолчанию - это база данных). Однако все не потеряно. Вы можете поместить свой код прямо в settings.php или написать небольшой обработчик кэша, что-то вроде этого:

class HackyDatabaseCache extends DrupalDatabaseCache { 
    function __construct($bin) { 
    // your code finding the database here. 
    parent::__construct($bin); 
    } 
} 

добавить $conf['cache_backends'][] = 'path/to/hackydatabasecache.inc'; и $conf['cache_class_cache_page'] = 'HackyDatabaseCache'; к вашему settings.php. Это позволит убедиться, что ваш код срабатывает перед любыми запросами. Если вы используете memcache или mongodb для кеширования, то расширьте это с помощью того же кода, просто измените, какой класс расширен.