私は何かについて混乱しています。PHPでオンラインユーザーを数える方法を検索しようとすると、すべての回答がMySQLとさまざまな方法に関連しています。
私のスクリプトでは、ログインフォームを送信するユーザーは、$ _ SESSION['$nickname']を作成します。
だから私は、count($ _ SESSION ['$ nickname']);でログインセッションを数えることができるかと思いました。私のページに表示しますか?
それとも、これは完全に間違った論理ですか?
最初に、「オンラインになる」とはどういう意味かを定義する必要があります。ユーザーは過去5分以内にリンクをクリックする必要がありますか?
データベースにすでにユーザーテーブルがあると仮定します。したがって、最も簡単な方法は、新しい列を追加することlastAction TIMESTAMP
です。
また、ユーザーがページ上のリンクをクリックすると、スクリプトはこの値を更新する必要があります。
そして、統計ページなどで、そのコードを持つオンラインユーザーの数を取得します。
SELECT COUNT(*) FROM users WHERE lastAction > (NOW() - 60*5)
完全に間違った論理。$_SESSIONはユーザーごとのものです。1人のユーザーのセッションは、他のユーザーのセッションと共有されません。考えてみてください。PHPで書かれたオンライン銀行で、すべてが1つの$ _SESSIONを共有しています。誰もが、すべてのアカウントの詳細を見ることができます。
標準のPHPファイルベースのセッションを使用していると仮定すると、保存されているディレクトリにあるセッションファイルを数えることができます。
$users = count(glob(session_save_path() . '/*'));
これはセッションファイルをカウントするだけであることに注意してください。間違いなく、まだガベージコレクションされていない古い/デッドセッションが含まれます。実際の「現在オンライン」が必要な場合は、各セッションファイルを解析し、その内容を調べる必要があります。
PHPは、セッションストレージに関して非常に柔軟性があり、独自のセッション保存/復元ハンドラーを定義できます。
ただし、デフォルトのセッションストレージはですfiles
。各セッションは個別にディスクに保存されます。つまり、「オンライン」(ここでは「オンライン=セッションは$_SESSION['$nickname']
setで存在すると仮定」)のユーザー数を確認するには、ディスクに保存されているすべてのセッションファイルを開き、一意のユーザー数を確認する必要があります。それらの中にニックネームが存在します。これは、時間と必要なリソースの両方で非常に重いものです。
したがって、ほとんどのチュートリアルでは、ユーザーごとに最後に表示されたタイムスタンプを維持することによって(そして、過去X分間に最後に表示されたユーザーの数を確認することによって)データベースでこれをカウントすることを提案しています。
結合したい場合は、データベースにセッション情報を格納するための独自のセッション保存ハンドラーを定義することで実行できます...
セッションに関するいくつかの追加のメモ:
$_SESSION["foo"]
、複数の異なるセッションで共有することはできません。PHPに相当するものはありませんGlobal.asa
。箱から出していない。これは間違ったロジックであり、セッションはエンドユーザーのPCにローカルに保存されてすぐに破棄されるだけなので、ユーザーが何かをしなければ、サーバーから読み取って確認することはできません。サーバー側のセッションは、ガベージのクリーンアップ時にのみ破棄されます。
最善の策は、ユーザーが何かを行うたびに更新される各ユーザーのタイムスタンプを用意することです。これは、JS / AJAX、PHPを介してこの更新をトリガーする必要があることを意味します。次に、たとえば、過去5分間にタイムスタンプがいくつあるかを確認できます。これにより、現在オンラインになっているユーザーの数を大まかに把握できます。
また、数秒ごとに継続的に更新してタイムスタンプを更新する非表示のiframeや、X秒ごとにタイムスタンプを更新するJS/AJAXを使用することもできます...