假设我的apache模块具有以下代码:

#include <iostream>
#include <string>

#include <httpd.h>
#include <http_core.h>
#include <http_protocol.h>
#include <http_request.h>

#include <apr_strings.h>

int count = 0;

static void my_child_init(apr_pool_t *p, server_rec *s)
{
    count = 1000; //starts up with this number!
}

static int my_handler(request_rec *r)
{
    count++; //Increments here
    ap_rputs(std::to_string(count).c_str(), r);

    return OK;
}

static void register_hooks(apr_pool_t *pool)
{
    ap_hook_child_init(my_child_init, NULL, NULL, APR_HOOK_MIDDLE);
    ap_hook_handler(my_handler, NULL, NULL, APR_HOOK_LAST);
}

module AP_MODULE_DECLARE_DATA   myserver_module =
{
    STANDARD20_MODULE_STUFF,
    NULL,            // Per-directory configuration handler
    NULL,            // Merge handler for per-directory configurations
    NULL,            // Per-server configuration handler
    NULL,            // Merge handler for per-server configurations
    NULL,            // Any directives we may have for httpd
    register_hooks   // Our hook registering function
};


现在,如果打开浏览器并转到localhost/my_server,则每次刷新页面时,我看到count都会递增,从而向Apache创建新的HTTP请求。

1001 //from connection 1
1002 //from connection 1
1003 //from connection 1
1004 //from connection 1
...


我期望每次刷新时都会看到count递增。但是有时候我看到apache可能创建了另一个连接,并且再次实例化了模块..现在我有两个相等的连接在运行:

1151 //from connection 1
1152 //from connection 1
1001 //  from connection 2
1153 //from connection 1
1002 //  from connection 2
1003 //  from connection 2
1154 //from connection 1
...


无论如何,我可以防止apache重新加载同一模块吗?

最佳答案

大多数Apache MPM /通用配置将创建多个子进程。您可以将它们配置为使用具有多个线程的单个进程,或者将共享内存用于计数器。

以可移植方式使用共享内存的最简单方法是依赖于“ slotmem”和“ slotmem_shm”模块。 mod_proxy_balancer使用它。另一种方法是server / scoreboard.c如何直接使用共享内存。

关于c++ - C/C++-如何在Apache HTTP Server中建立单例连接模块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47488866/

10-16 16:15