4

特定のページにアクセスした人の数を追跡するのに役立つヒットカウンターを作成しています。この情報を保持するテーブルには、page_id、ip_address、およびタイムスタンプ(IPアドレスがページにアクセスしたとき)が含まれます。

私が抱えている「問題」は、この情報を保存するための最良の方法です。ユーザーがページにアクセスするたびに保存すると、Webサイトのパフォーマンスに影響するだけでなく、保存プロセスで問題が発生する可能性があります。おそらくファイルApplication_End内のを使用して、カウンターテーブルにレコードを追加することを望んでいました。Global.asaxしかし、どうすればそのようなレコードを保存できますか?Application変数を利用しますか?はいの場合、どのように?

4

2 に答える 2

5
which is the best way to save this information

ページ表示のパフォーマンスに影響を与えないようにするのに役立つ3つの方法があり、どのデータを保存して維持するかだけを気にします。

最初の方法

ページから画像として呼び出すハンドラーを使用して、この統計カウンターを書き込むことのみができます。このハンドラーでは、セッションを使用しないため、他のページをブロックすることもありません。また、これはほとんどのスパイダーから呼び出されないため、実際のユーザーのみを記述します。

この方法でページに電話をかけます。

<img src="keepstats.ashx?Page=CurrentPage.aspx" height="1" width="1" alt="" >

ハンドラーは

// 1x1 transparent GIF
private readonly byte[] GifData = {
    0x47, 0x49, 0x46, 0x38, 0x39, 0x61,
    0x01, 0x00, 0x01, 0x00, 0x80, 0xff,
    0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
    0x00, 0x2c, 0x00, 0x00, 0x00, 0x00,
    0x01, 0x00, 0x01, 0x00, 0x00, 0x02,
    0x02, 0x44, 0x01, 0x00, 0x3b
};

public void ProcessRequest (HttpContext context) 
{
    // save here your stat counter

    // send the image
    context.Response.ContentType = "image/gif";
    context.Response.Buffer = false;
    context.Response.OutputStream.Write(GifData, 0, GifData.Length);
}

2番目の方法

この関数をコードビハインドからではなく、そのように最後のページ内から呼び出すこと。この場合の不利な点は、セッションがページをロックしており、次のリクエストを続行できるようにページを完全にロードする必要があることです。しかし、最も簡単に作成できます。

<body>
... all the page here...


..bottom of the page..
<%
  // you send this part of the page and user all ready see it
  Response.Flush();
  // now you call the function that calculate the statistics
  // the page still show that is loading, but the user all ready see it
  CallTheStatisticSaveFunction();
%>
</body>

第三の道

作業を並行してページから独立させるためのスレッドを作成する方法をもう1つ忘れています。

最後の言葉

私のコードでは、上記のすべてのトリックを使用します。1つは統計用で、もう1つはページで実行する必要があるが、もう少し時間がかかる可能性のあるアクション用です。ページのレンダリングを開始する前に実行する必要のあるアクションにスレッドを使用しますが、スレッドが終了しない場合は、自分が持っているものをレンダリングするというトリックがいくつかあります。

この理由から、ユーザー全員がページを見る準備ができているかどうかを知るためのセッションは避けます。

  1. ユーザーがCookieを使用しない場合、セッションは機能せず、すべてのスパイダーはセッションを使用しません
  2. ユーザーが多くのページを見始めると、セッションデータは大きくなります。

iisを閉じるか、アプリケーションを停止すると、これApplication_Endは1つだけと呼ばれます。グローバルで毎回呼び出されるポイントは、Application_BeginRequestパフォーマンスに影響を与える可能性があります。これは、すべてのasp.net要素に対して呼び出され、そのページかどうか、他の何かがあるかどうか、およびこれをページの最初のポイントで確認する必要があるためです。 、そこで遅延が発生します。ユーザーが何かを見た後、最後に統計を書く方法をここで検索します。

于 2012-04-22T08:30:25.257 に答える
0

いくつかのオプションがあります。オブジェクトを使用Sessionしてヒットを保存できるため、同じユーザー(IPアドレス)が同じページにヒットしたときに、再度保存されることはありません。

このオプションは、1つのサーバーで実行している場合(もちろん、Webファームに対するソリューションはありますが、あなたの場合ではないと思います。ここで詳しく説明するのは間違っている可能性があります)、セッションはすぐに利用可能なメモリをいっぱいにするため、ユニークな訪問者が多すぎます。

Redisを使用するなど、他のオプションもありますが、最初は、Session負荷がそれほど高くないサイトでは、を使用して繰り返しヒットをフィルタリングしても問題ありません。

于 2012-04-22T08:06:17.263 に答える