2011-01-21 5 views
0

나는 사용자 정의 모듈 후크 내부의 여러 조건에 따라 사용되는 DB 연결을 변경하려고하고, 적절하게 이름을 mymodule_init()mymodule_init()의 Drupal 7 db_set_active()?

hook_init()가 일찍 부트 스트랩에서라고 때문에이 기능을 넣어 논리적 인 장소를 보였다 게임, 어떤 DB를 쿼리하기 전에 ???

그래서 수영장에 여러 개의 연결이 있으며 어느 것이 사용되는지는 모듈에 의해 결정됩니다. 인생을 위해 시스템을 DB를 유지할 수 없습니다 -이 후크가 실행 된 후 자체를 다시 '기본값'으로 재설정하는 것으로 보입니다. 코드베이스 검색은 거의 효과가 없으므로 db_set_active()에 대한 호출이 한두 번만 수행됩니다.

아이디어가 있으십니까? 어떤 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를 사용하는 경우 확장 된 클래스 만 변경하면 동일한 코드로 확장 할 수 있습니다.