我剛剛開始瞭解Apache服務器的作品,並且所述一天編程一個非常簡單的網頁時,同時顯示命中計數的網頁我遇到了一個問題:Apache的prefork的/ MPM工人
/* 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創建了一堆子進程,其中一些進程處於空閒狀態,並等待客戶端進行連接,因此,當我刷新頁面時,實際上是連接到服務器正在運行的一堆不同的子進程。但是,這個模塊的子進程數量有限,它可以同時保持運行,所以有時當它殺死一個進程時,我的計數器就會停止。我不完全確定這個解釋是否正確,或者爲什麼櫃檯下降。
所有建議表示讚賞。