2011-12-02 13 views
0

私がどれだけのapacheサーバ作品、ページのヒット数を表示しながら、非常に簡単なWebページをプログラミングするとき、私は、問題に遭遇したandthe他の日を理解し始めています:のApacheのプリ/ワーカー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は、永遠に存在する1つの子プロセスしか生成しないようにApacheを設定できますが、これを行うとApacheの機能が制限されます。

モジュールを完全にステートレスにすることをお勧めします。そのヒットカウンタが必要な場合は、ファイルまたはデータベースに状態を保存し、必要に応じてその状態を取得します。ヒットしたカウンタが現時点ではあなたのモジュールのような静的変数に入っている別のプロセスと話すことさえできます。

0

ヒット数をnoOfViews変数に格納しています。これは、1つのプロセスのメモリ内にあることを意味します。

通常、httpdはワーカーまたはプリフォークMPMのどちらであっても、複数の子プロセスを生成します。それぞれにはnoOfViewsのための独自のメモリー・ストレージがあるため、そのプロセスのヒット数を数えています。あなたの要求が別のプロセスに無作為に与えられるとき、それは異なったカウンターを持っています。

作業者はスレッド化されていて複数回処理されるのに対し、各プリフォーク処理は一度に1つの要求のみを処理するため、作業者よりも前処理の方が多くなります。就職前よりもはるかに多くのプロセスが労働者よりも多い。しかし、あなたの要求が別のプロセスに向けられている場合、どちらのMPMでも同じことが起こります。

また、httpdを再起動するか、個々のプロセスを強制終了するだけでカウンタが失われることにも注意してください。新しいプロセスはカウント0で開始されます。これは、ヒット数をグローバルにカウントすることが目的の場合には適していません。