負荷がかかった状態でデータベースを傷つけないリアルタイムの一意のカウンターの良い習慣は何ですか?
4 に答える
ストレスが少ない?問題をアウトソーシングしてください :)、たとえば、Google アナリティクスを使用します。
(ただし、Google Analytics はリアルタイムではありません。分析ツールの他のプロバイダーは、リアルタイム ソリューションを提供していますが、KISSmetrics など) 。
ユーザー セッションをデータベースまたはキャッシュ システム (APC や Memcached など) に格納する (カスタム) セッション ハンドラーを使用する場合があります。
そうすれば、Web サイトのアクティブなセッションの数をカウントできます (各訪問者には一意のセッション ID が与えられます)。
セッションに非常に短いセッション タイムアウトを与えて、ユーザーがページにアクセスしなくなった場合でも、ユーザーが「アクティブ」としてカウントされないようにします。
セッションを使用すると、複数の人が同じ IP アドレスを共有している場合でも、現在 Web サイトにアクセスしている人の数を追跡できます。
visitor_counter
行ip
とを含むデータベース テーブルwhen
。when
次に、ページが読み込まれるたびに、 (datetime フィールドまたはタイムスタンプを含む int フィールド)から指定された時間内にユーザーの IP がデータベースにあるかどうかを確認します。IP がデータベースにある場合は、何もしないでください。そうでない場合は、追加します。その後、経過時間に基づいて値を定期的に整理しますwhen
。合計訪問者数には COUNT(ip) を使用できます。
これは、過去 X 時間の訪問者を表示するように調整できます。また、visits
フィールドを追加して、ユーザーがロードしたページ数などを確認できます。
これがどのように機能するかは完全にはわかりませんが、理論的にはあなたが望むことをすると思います。
Web サイトを構築していてカウンターが必要な場合は、無料で使用できる分析 (Google アナリティクス、Yahoo アナリティクスなど) と、単純なカウンター スクリプトよりもはるかに多くの情報を提供できるカウンター サービスがたくさんあります。これは私のお勧めです。
ただし、自分で何かを構築していて、サーバーを制御している場合は、別のツールを使用して実際にカウントを行うことができます。memcache は「add」および「increment」メソッドをサポートしているため、この目的で memcache を使用しました。このメソッドは、(コマンドの使用に関する制限により) 後で呼び出されると、このような高速リアルタイム カウンターを作成できます。
Memcache は非常に高速 (低速のマシンで 1 秒あたり 200,000 以上のリクエスト) のメモリ キャッシュ ソリューションですが、永続的なストレージではありません。カウントされた数値を保存するための別のソリューションが必要になります。
これは、独自の関数でリクエストの先頭に追加された、そのようなタスクに対する私のソリューションです。
$m = new Memcache;
$m->addServer('localhost', 11211);
$cacheKey = "performance_".gmmktime();
// Add in case it doesn't exist, no compression, 1 hour timeout
$m->add($cacheKey, (int) 0, false, (60*60));
// Increment cache
$m->increment($cacheKey, (int) 1);
$cacheKey を変更すると、複数の異なるものをカウントすることもできます。
次に、毎分 cron スクリプトでこの情報を収集し、データベースに追加する別のコードがあります。このソリューションは、実装のニーズに応じて複数のマシンでも機能し、スケーラブルなカウンターの実装を可能にします。
明らかに、これは単純な例にすぎませんが、うまくいけば、その使用法を見ることができます。このコードは、PHP を実行する大規模なマルチサーバー ゲーム サービスで使用されています。