gpt4 book ai didi

c - Apache Prefork/Worker MPM

转载 作者:行者123 更新时间:2023-11-30 18:03:31 25 4
gpt4 key购买 nike

我刚刚开始了解 apache 服务器的工作原理,前几天我在编写一个非常简单的网页并显示页面点击计数时遇到了问题:

/* The simplest HelloWorld module */
#include <httpd.h>
#include <http_protocol.h>
#include <http_config.h>

static int noOfViews = 0;

static int helloworld_handler(request_rec *r)
{

if (!r->handler || strcmp(r->handler, "helloworld")) {
return DECLINED;
}

if (r->method_number != M_GET) {
return HTTP_METHOD_NOT_ALLOWED;
}
noOfViews++;

ap_set_content_type(r, "text/html;charset=ascii");
ap_rputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n",
r);
ap_rputs("<html><head><title>Apache HelloWorld "
"Module</title></head>", r);
ap_rputs("<body><h1>Hello World!</h1>", r);
ap_rputs("<p>This is the Apache HelloWorld module!</p>", r);
ap_rprintf(r, "<p>Views: %d</p>", noOfViews);
ap_rputs("</body></html>", r);
return OK;
}

static void helloworld_hooks(apr_pool_t *pool)
{
ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

module AP_MODULE_DECLARE_DATA helloworld_module = {
STANDARD20_MODULE_STUFF,
NULL,
NULL,
NULL,
NULL,
NULL,
helloworld_hooks
};

基本上发生的事情是,当我刷新页面时,点击计数器会上升,但有时它的数量会随机下降。有人告诉我这是因为 Apache Prefork MPM 的工作方式。读完本文后:

http://httpd.apache.org/docs/2.0/mod/prefork.html

我更了解这个问题,但我仍然不能 100% 确定发生了什么。因此,prefork MPM 创建了一堆子进程,其中一些处于空闲状态,并等待客户端连接,因此当我刷新页面时,我实际上正在连接到服务器正在运行的一堆不同的子进程。然而,这个模块可以同时保持的子进程数量有限,所以有时当它杀死一个进程时,我的计数器会下降。我不完全确定这个解释是否正确或计数器下降的确切原因。

感谢所有建议。

最佳答案

是的,要么这样,要么当计数器下降时,您可以让其他 Apache 进程之一为您提供请求。

您可以尝试以这样的方式配置 Apache,使其仅生成 1 个永远存在的子进程,但这样做会限制 Apache 的功能。

我建议您尝试让您的模块完全无状态。如果您需要点击计数器,请将状态保存在文件或数据库中,并在需要时从那里检索它。您甚至可以与另一个进程对话,该进程的命中计数器仅位于静态变量中,就像您目前的模块一样。

关于c - Apache Prefork/Worker MPM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8360500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com