Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
apache2中的Init模块_Apache_Module_Apache2_Initialization - Fatal编程技术网

apache2中的Init模块

apache2中的Init模块,apache,module,apache2,initialization,Apache,Module,Apache2,Initialization,我曾经在Apache1.3中编写apache模块,但现在我愿意使用apache2。为了提高性能,我目前正在编写的模块拥有自己的二进制数据,而不是数据库。我需要将这些数据加载到共享内存中,这样每个孩子都可以访问这些数据,而无需制作自己的副本,而且在启动时加载/创建二进制数据将是切实可行的,就像我在apache 1.3中所做的那样。问题是,在apache2中,在模块结构的1.3中,我并没有找到一个init事件,在标准的_module _内容之后,您会立即找到一个/**模块初始值设定项*/,您可以在其

我曾经在Apache1.3中编写apache模块,但现在我愿意使用apache2。为了提高性能,我目前正在编写的模块拥有自己的二进制数据,而不是数据库。我需要将这些数据加载到共享内存中,这样每个孩子都可以访问这些数据,而无需制作自己的副本,而且在启动时加载/创建二进制数据将是切实可行的,就像我在apache 1.3中所做的那样。问题是,在apache2中,在模块结构的1.3中,我并没有找到一个init事件,在标准的_module _内容之后,您会立即找到一个/**模块初始值设定项*/,您可以在其中放置一个将提前执行的函数。 我以前编写的函数体类似于:

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
}
我正在apache2中寻找一个可以放置类似功能的地方

你能帮忙吗

谢谢
Benvenuto

您可以使用child_init hook来初始化资源,该资源将比请求或连接持续更长时间

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 */
};
在apache进入操作模式之前或在线程化MPM中创建线程之前,将调用子init hook。传递到my_child_init函数的池应该是进程池


为了获得更好的示例,您应该下载apache源代码并检查modules/experimental/mod_example.c文件。

因为您希望服务器创建一个供所有子级使用的共享内存段,所以我建议在post config挂钩(ap_hook_post_config)中对此进行初始化。在读取配置之后,但在生成子配置之前,会调用此函数,因此它应该可以正常工作。

由于Apache 2.x会两次加载DSO模块,因此在Apache启动期间会两次调用ap_hook_post_config()

添加到ap_hook_post_config()的以下代码将阻止在第一次调用期间初始化模块,并仅在第二次调用期间继续

这是一个黑客,但一个整洁的黑客:)

您可以在上阅读有关双dso模块负载的更多信息

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