2

私は何かについて混乱しています。PHPでオンラインユーザーを数える方法を検索しようとすると、すべての回答がMySQLとさまざまな方法に関連しています。

私のスクリプトでは、ログインフォームを送信するユーザーは、$ _ SESSION['$nickname']を作成します。

だから私は、count($ _ SESSION ['$ nickname']);でログインセッションを数えることができるかと思いました。私のページに表示しますか?

それとも、これは完全に間違った論理ですか?

4

4 に答える 4

4

最初に、「オンラインになる」とはどういう意味かを定義する必要があります。ユーザーは過去5分以内にリンクをクリックする必要がありますか?

データベースにすでにユーザーテーブルがあると仮定します。したがって、最も簡単な方法は、新しい列を追加することlastAction TIMESTAMPです。

また、ユーザーがページ上のリンクをクリックすると、スクリプトはこの値を更新する必要があります。

そして、統計ページなどで、そのコードを持つオンラインユーザーの数を取得します。

SELECT COUNT(*) FROM users WHERE lastAction > (NOW() - 60*5)
于 2012-08-14T11:42:06.760 に答える
4

完全に間違った論理。$_SESSIONはユーザーごとのものです。1人のユーザーのセッションは、他のユーザーのセッションと共有されません。考えてみてください。PHPで書かれたオンライン銀行で、すべてが1つの$ _SESSIONを共有しています。誰もが、すべてのアカウントの詳細を見ることができます。

標準のPHPファイルベースのセッションを使用していると仮定すると、保存されているディレクトリにあるセッションファイルを数えることができます。

$users = count(glob(session_save_path() . '/*'));

これはセッションファイルをカウントするだけであることに注意してください。間違いなく、まだガベージコレクションされていない古い/デッドセッションが含まれます。実際の「現在オンライン」が必要な場合は、各セッションファイルを解析し、その内容を調べる必要があります。

于 2012-08-14T11:44:02.530 に答える
3

PHPは、セッションストレージに関して非常に柔軟性があり、独自のセッション保存/復元ハンドラーを定義できます。

ただし、デフォルトのセッションストレージはですfiles。各セッションは個別にディスクに保存されます。つまり、「オンライン」(ここでは「オンライン=セッションは$_SESSION['$nickname']setで存在すると仮定」)のユーザー数を確認するには、ディスクに保存されているすべてのセッションファイルを開き、一意のユーザー数を確認する必要があります。それらの中にニックネームが存在します。これは、時間と必要なリソースの両方で非常に重いものです。

したがって、ほとんどのチュートリアルでは、ユーザーごとに最後に表示されたタイムスタンプを維持することによって(そして、過去X分間に最後に表示されたユーザーの数を確認することによって)データベースでこれをカウントすることを提案しています。

結合したい場合は、データベースにセッション情報を格納するための独自のセッション保存ハンドラーを定義することで実行できます...


セッションに関するいくつかの追加のメモ:

  • ブラウザを閉じても、セッションはすぐには破棄されません。実際、ブラウザはサーバーが閉じられていることをサーバーに通知しません。これは、サーバーが、誰がオンラインで誰がオンラインでないかを決定するための時間ベースのアルゴリズムを考え出す必要があることを意味します。
  • セッションは互いに分離されているため$_SESSION["foo"]、複数の異なるセッションで共有することはできません。PHPに相当するものはありませんGlobal.asa。箱から出していない。
于 2012-08-14T11:46:34.033 に答える
0

これは間違ったロジックであり、セッションはエンドユーザーのPCにローカルに保存されてすぐに破棄されるだけなので、ユーザーが何かをしなければ、サーバーから読み取って確認することはできません。サーバー側のセッションは、ガベージのクリーンアップ時にのみ破棄されます。

最善の策は、ユーザーが何かを行うたびに更新される各ユーザーのタイムスタンプを用意することです。これは、JS / AJAX、PHPを介してこの更新をトリガーする必要があることを意味します。次に、たとえば、過去5分間にタイムスタンプがいくつあるかを確認できます。これにより、現在オンラインになっているユーザーの数を大まかに把握できます。

また、数秒ごとに継続的に更新してタイムスタンプを更新する非表示のiframeや、X秒ごとにタイムスタンプを更新するJS/AJAXを使用することもできます...

于 2012-08-14T11:44:24.877 に答える