2011-12-02 43 views
0

我剛剛開始瞭解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創建了一堆子進程,其中一些進程處於空閒狀態,並等待客戶端進行連接,因此,當我刷新頁面時,實際上是連接到服務器正在運行的一堆不同的子進程。但是,這個模塊的子進程數量有限,它可以同時保持運行,所以有時當它殺死一個進程時,我的計數器就會停止。我不完全確定這個解釋是否正確,或者爲什麼櫃檯下降。

所有建議表示讚賞。

回答

0

是的,無論是你還是其他Apache進程中的一個來處理計數器故障時爲你提供請求。

您可以嘗試配置Apache,使其僅生成一個永久存在的子進程,但這樣做會限制Apaches功能。

我建議您嘗試並保持模塊完全無狀態。如果你想要那個計數器,將狀態保存在文件或數據庫中,並在需要時從中檢索它。你甚至可以在另一個只有像你的模塊那樣的靜態變量中有觸發器的進程。

0

您正在將命中計數存儲在noOfViews變量中,這意味着在單個進程的內存中。

無論是在worker還是prefork MPM下,httpd通常都會生成多個子進程。每個將有自己的存儲空間noOfViews,所以你只計算該過程的點擊次數。當你的請求被隨機分配給不同的進程時,它有不同的計數器。

您會注意到prefork比worker更多,因爲每個prefork進程一次只能處理一個請求,而worker只能處理多個請求,因此prefork下的流程比worker更多。但是,當您的請求指向不同的進程時,任何一個MPM都會發生同樣的情況。

另請注意,重新啓動httpd,或者僅僅殺死單個進程將會丟失計數器。新的流程將從0開始計算。因此,如果您的目標是統計全球排名,這不是一個好方法。

相關問題