2010-04-30 4 views
4

아파치 1.3에서 아파치 모듈을 작성하는 데 익숙했지만, 요즘에는 아파치 2에 기꺼이 전달하려고합니다. 필자가 작성한 모듈은 성능상의 이유로 데이터베이스가 아닌 자체 바이너리 데이터입니다. 이 데이터를 공유 메모리에로드해야하므로 모든 자식이 자신의 복사본을 만들지 않고 액세스 할 수 있으며 아파치 1.3에서 사용했던 것처럼 시작시 이진 데이터를로드/생성하는 것이 실용적입니다. 문제는 모듈 구조체의 apache2에서 init 이벤트를 찾지 못하는 것입니다. immediatly STANDARD_MODULE_STUFF 다음에/** 모듈 이니셜 라이저 * /가있는 곳을 찾은 후 일찍 실행될 함수를 넣을 수 있습니다 .아파치 2의 초기화 모듈

if (getppid == 1) 
{ 
    // Load global data here 
    // this is the parent process 
    void* data = loadGlobalData(someFilePath); 
    setGlobalData(config, data); 
} 
else 
{ 
    // this is the init of a child process 
    // do nothing 
} 

내가 유사한 기능을 넣을 수있는 곳에서 아파치에서 장소를 찾고 있어요 : 내가 작성하는 데 사용하는 기능의 몸은 뭔가 같다.

도와 주시겠습니까?

감사 벤 베누

답변

1

은 그런 요청하거나 연결을 오래 지속하는 자원을 초기화하기 위해 child_init 후크를 사용할 수 있습니다.

typedef struct { 
    apr_pool_t *pool; 
    apr_hash_t *hash; 
} my_server_config; 

static void my_child_init(apr_pool_t *p, server_rec *s) 
{ 
    my_server_config cfg = ap_get_module_config(s->module_config, &my_module); 
    /* Create sub-pool: ap_pool_create(&cfg->pool, p); */ 
    /* Create hash: cfg->hash = ap_hash_make(cfg->pool); */ 
} 

static void my_register_hooks(apr_pool_t *p) 
{ 
    ap_hook_child_init(my_child_init, NULL, NULL, APR_HOOK_MIDDLE); 
} 

module AP_MODULE_DECLARE_DATA my_module = 
{ 
    STANDARD20_MODULE_STUFF, 
    NULL, /* per-directory config creator */ 
    NULL, /* dir config merger */ 
    NULL, /* server config creator */ 
    NULL, /* server config merger */ 
    NULL, /* command table */ 
    my_register_hooks, /* set up other request processing hooks */ 
}; 

자식 init 훅은 아파치가 작동 모드로 들어가기 전에 또는 스레드가 스레드 된 MPM에서 작성되기 전에 호출됩니다. my_child_init 함수에 전달 된 풀은 프로세스 풀이어야합니다.

더 좋은 예를 들면 apache 소스 코드를 다운로드하고 modules/experimental/mod_example.c 파일을 확인해야합니다.

3

모든 자식이 사용할 단일 공유 메모리 세그먼트를 서버에 생성하려면 post config hook (ap_hook_post_config)에서 초기화하는 것이 좋습니다. 일단 구성이 읽혀지면 자식이 생성되기 전에 호출되므로 제대로 작동해야합니다.

3

Apache 2.x는 DSO 모듈을 두 번로드하므로 Apache를 시작하는 동안 ap_hook_post_config()가 두 번 호출됩니다.

ap_hook_post_config()에 추가 된 다음 코드는 첫 번째 호출 중에 모듈 초기화를 방지하고 두 번째 호출 중에 만 계속됩니다.

해킹이지만, 깔끔한 해킹 :

void *data = NULL; 
const char *key = "dummy_post_config"; 

// This code is used to prevent double initialization of the module during Apache startup 
apr_pool_userdata_get(&data, key, s->process->pool); 
if (data == NULL) { 
    apr_pool_userdata_set((const void *)1, key, apr_pool_cleanup_null, s->process->pool); 
    return OK; 
} 

당신은 Apache wiki 더블 DSO 모듈로드에 대한 자세한 내용을보실 수 있습니다.

관련 문제