2011-01-21 74 views
0

我試圖改變所使用基於自定義模塊的鉤子裏的幾個條件,DB連接,恰當地命名mymodule_init()Drupal 7 db_set_active()in mymodule_init()?

hook_init()似乎是一個合乎邏輯的地方把這個功能,因爲它被稱爲自舉這麼早遊戲,在任何數據庫查詢之前?

所以我有一個池中的幾個連接,哪一個被使用是由模塊決定的。對於我無法讓系統堅持數據庫的生活 - 似乎在執行此鉤子後將自己重置爲「默認」。搜索代碼庫的效果不大,而且只有一個或兩個對db_set_active()的調用。

任何想法?在任何數據庫活動完成之前,我應該重寫哪個鉤以更改運行時的數據庫連接?

乾杯,亞歷克斯

回答

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進行緩存,則使用相同的代碼擴展它,只需更改擴展的類。