Init modules in apache2

后端 未结 3 1344
失恋的感觉
失恋的感觉 2021-01-13 21:30

I used to write apache modules in apache 1.3, but these days I am willing to pass to apache2. The module that I am writing at the moment has is own binary data, not a databa

相关标签:
3条回答
  • 2021-01-13 21:42

    You can use a child_init hook to initialize a resource that will last longer then request or connection.

    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 */
    };
    

    Child init hook will be called before apache enters operational mode or before threads are created in threaded MPM. The pool passed into the my_child_init function should be process pool.

    For better example you should download apache source code and check the modules/experimental/mod_example.c file.

    0 讨论(0)
  • 2021-01-13 21:55

    Since you want the server to create a single shared memory segment to be used by all children, I would recommend initialising this in the post config hook (ap_hook_post_config). This is called once the configuration has been read, but before the children are spawned, so it should work well.

    0 讨论(0)
  • 2021-01-13 22:01

    Since Apache 2.x loads DSO modules twice, ap_hook_post_config() is called twice during Apache startup.

    The following code added to the ap_hook_post_config() will prevent the initialization of your module during the first call and continue only during the second call.

    This is a hack, but a neat hack :)

    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; 
    }
    

    You can read more about double dso module loads on the Apache wiki.

    0 讨论(0)
提交回复
热议问题