PHPでオンラインの人数を数える方法

WBOY
リリース: 2016-06-21 08:58:22
オリジナル
1014 人が閲覧しました

統計|オンライン|オンライン人口

フォーラムで誰かがオンラインの人数を数える方法を尋ねました。私も何が最善の方法なのか分かりません。以下に当サイトの実装原則を記載させていただきましたので、ご参考までに。これは単なる私の方法であり、決して最善ではありません。専門家が私を修正してくれることを願っています。

実際、同時にオンラインの人数を正確にカウントすることは非現実的です。これは、HTTP プロトコルがステートレス プロトコルであるためです。クライアントがサーバーにリクエストを送信すると、ページが完全にロードされたときなど、セッションが終了すると、サーバーはすぐに新しい TCP/IP 接続を確立します。一般に、オンラインの人数は、HTTP プロトコルに基づく同時接続の数ではなく、一定期間内にサイトに同時にアクセスした人の数を指します。

まず、訪問者がどのように Web サイトにアクセスするかを見てみましょう。対象の Web サイトのアドレスをブラウザのアドレス バーに入力し、一定期間その Web サイトのページを閲覧し続けます。最後にブラウザを閉じるか、新しい URL を入力すると、閲覧が終了します。サーバー側では、訪問者がいつ到着したかを知ることができ、訪問者がいつページを閲覧しているかを知ることもできますが、いつ離れるかをどうやって知ることができるでしょうか? HTTP プロトコルはステートレスであるため、それを知る方法はありません。一般的には、訪問者がサイト上のページを最後に閲覧した時刻を記録することです。訪問者が特定の期間内に新しいアクションを行わなかった場合、その訪問者は去ったとみなされます。

上記の考えに基づくと、データベースはテキスト ファイルなどの他の方法より効率的であるため、データベースを使用するのが最善であると思います。以下の例では MySQL を使用していますが、他のタイプのデータベース システムでも簡単に使用できます。次に、すべてのページでこの PHP ファイルを呼び出してデータを更新し、オンラインの人数を表示します。ただし、疑問があります。人々が同時に訪問するのにどれくらい時間がかかりますか?一般的には 30 分、つまり 1800 秒です。具体的な時間は Web サイトの状況に応じて決定されます。この時間が長いほど、より多くの同時オンライン人数がカウントされます。このサイトは15分900秒です。訪問者を表す良い方法は、IP アドレスで表すことです。ダイヤルアップ インターネット アクセスの場合、同じ IP アドレスが割り当てられた 2 人のユーザーが短時間に同じ Web サイトを閲覧する可能性は非常に低いです。

まず、MySQL ツールを使用してテーブルを作成します。

CREATE TABLE ccol(
id integer not null auto_increment, #Record ID
ip char(15) not null, #訪問者の IP アドレス
dtstamp datetime not null, #最終アクセス時刻
uri char(255), #訪問者の要求された URI
主キー (id)
); 次に、次のように記述します。 PHP コード:

/*

ファイル: ccol.php - ConCurrent OnLine 統計
目的: 同時にオンライン閲覧している人の数をカウントします
作成者:Hunte、hunte@phpuser.com
更新: 2000-4-25
*/

$duration=1800;

require "db.php"; /DBSQL が含まれます。詳細については、私の他の記事を参照してください。

$ccol->connect(); UNIX_TIMESTAMP( NOW())-UNIX_TIMESTAMP(dtstamp))>$duration");
//30 分より古いレコードを削除
$ccol->query("SELECT * FROM ccol WHERE ip=' $REMOTE_ADDR' ");
//現在の IP がテーブルに存在するかどうかを確認します
if ($ccol->nf())//はい?
{
$ccol->next_record();//見つかったレコード配列のポインタを下に移動します
$id=$ccol->f('id'); - >query("UPDATE ccol SET dtstamp=now(), uri='$REQUEST_URI' WHERE id=$id");
//最終アクセス時刻とアクセスページを設定します
}
else // なし
{
$ccol-> query("INSERT INTO ccol VALUES (0, '$REMOTE_ADDR', now(), '$REQUEST_URI')"); 🎜> $ccol->query("SELECT COUNT(*) AS ccol FROM ccol WHERE (UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(dtstamp))
//半分で調べます1 時間以内のレコードの場合、次の WHERE 句はオプションです。時間を超えたレコードは削除されています。
$ccol->next_record()
echo "オンラインの人数:", $ccol-> f( 'ccol');
$ccol->free_result();

使い方は?サイトのすべてのページでこのプログラムを呼び出します。例:
--index.php

...