Drupal 7 db_set_active () в mymodule_init ()? - PullRequest
0 голосов
/ 21 января 2011

Я пытаюсь изменить используемое соединение с БД, основываясь на нескольких условиях внутри пользовательского хука модуля, метко названного mymodule_init ()в начальной загрузке, до того, как какая-либо БД запросит ???

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

Есть идеи?Какой хук я должен переопределить, чтобы изменить соединение с БД во время выполнения до того, как будет выполнено какое-либо действие БД ???

Cheers, Alex

1 Ответ

1 голос
/ 22 января 2011

Вряд ли 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 для кэширования, то расширьте его с помощью того же кода, просто измените, какой класс будет расширен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...