2011-01-21 5 views
0

Je suis en train de changer qui connexion DB à utiliser en fonction de plusieurs conditions à l'intérieur d'un crochet de module personnalisé, mymodule_init porte bien son nom()Drupal 7 db_set_active() dans mymodule_init()?

hook_init() semblait un endroit logique pour mettre cette fonctionnalité, car il est appelé si tôt dans le bootstrap jeu, avant toutes les requêtes DB?

J'ai donc plusieurs connexions dans un pool et celle qui est utilisée est déterminée par le module. Pour la vie de je ne peux pas obtenir le système pour persister la DB - semble se remettre à «défaut» après que ce crochet soit exécuté. La recherche dans le code a peu d'effet et seulement un ou deux appels à db_set_active() sont effectués.

ANy idées? Quel hook devrais-je remplacer pour modifier la connexion de la base de données au moment de l'exécution avant toute activité de la base de données?

Cheers, Alex

Répondre

1

À peine est-hook_init « au début du jeu » et certainement pas le premier à tirer des requêtes de base de données. L'ordre d'amorçage est: charger la configuration, essayer de servir la page à partir du cache, initialiser la base de données, charger les variables, charger la session, en-tête de la page. Le premier hook à tirer est hook_boot si le cache de page a un hit ou dans l'en-tête de page - au moins la variable init phase a déclenché une requête soit pour charger les variables de la base de données (ou pour les récupérer du cache mais ne peut pas compter sur le cache et le cache par défaut est la base de données de toute façon). Cependant, tout n'est pas perdu. Vous pouvez mettre votre droit de code dans settings.php ou écrire un petit gestionnaire de cache, quelque chose comme ceci:

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

ajouter $conf['cache_backends'][] = 'path/to/hackydatabasecache.inc'; et $conf['cache_class_cache_page'] = 'HackyDatabaseCache'; à votre settings.php. Cela permettra de s'assurer que votre code se déclenche avant toute requête. Si vous utilisez memcache ou mongodb pour la mise en cache, étendez-le avec le même code, changez seulement la classe qui est étendue.