2011-01-21 11 views
0

私はカスタムモジュールのフック内部いくつかの条件に基づいて使用するためにどのDB接続に変更しようとしています、適切な名前mymodule_init()mymodule_init()のDrupal 7 db_set_active()?

hook_init()それがこんなに早く、ブートストラップで呼ばれていますので、この機能を置くための論理的な場所に見えましたゲームは、任意のDBクエリの前に???

プール内に複数の接続があり、どちらが使用されているかはモジュールによって決まります。人生のために私はDBを永続させるためのシステムを得ることができません - このフックが実行された後、自分自身を「デフォルト」に戻すようです。コードベースの検索ではほとんど効果がありません.db_set_active()への呼び出しも1〜2回だけです。

アイデア?任意のDBアクティビティが実行される前に、実行時にDB接続を変更するにはどのようなフックをオーバーライドする必要がありますか?

乾杯、 アレックス

答えて

1

とたんと確かにないデータベースクエリを発射する最初の「早期のゲームで」hook_initではありません。ブートストラップの順序は、構成のロード、キャッシュからのページの提供、データベースの初期化、変数のロード、セッションのロード、ページ・ヘッダーの実行です。最初のフックはhook_bootです。ページキャッシュにヒットまたはページヘッダーがある場合 - 少なくとも変数initフェーズでデータベースから変数を読み込む(またはキャッシュから取得するが、キャッシュに依存することはできず、デフォルトのキャッシュはデータベースです)。しかし、すべてが失われません。あなたは正しいsettings.phpでコードを入れたり、小さなキャッシュハンドラを記述し、このようなものができ、次のいずれか

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

は、あなたのsettings.php$conf['cache_backends'][] = 'path/to/hackydatabasecache.inc';$conf['cache_class_cache_page'] = 'HackyDatabaseCache';を追加します。これにより、クエリの前にコードが確実に実行されます。キャッシュにmemcacheまたはmongodbを使用している場合は、同じコードを使用して拡張することで、どのクラスが拡張されるかを変更するだけです。