14

現在オンラインになっているユーザーを追跡したいと思います。

オンラインであるという定義は、チャット機能を備えたWebサイトのインデックスページにいるときです。

これまでのところ、私が考えることができるのは、ユーザーのCookieを設定することだけです。次の訪問でCookieが見つかると、ajax呼び出しが行われ、ユーザー名、オンラインステータス、および時刻でテーブルが更新されます。

さて、私の実際の質問は、彼らがWebサイトを離れるときに、どうすれば確実にステータスをオフにできるかということです。私が考えることができる唯一のことは、ユーザーの操作がない所定の時間を設定してから、ステータスをオフに設定することです。

しかし、私が本当に望んでいるのは、インタラクションの有無にかかわらず、サイトにいる限りステータスをオンに保ち、サイトを離れるときにのみオフにすることです。

4

6 に答える 6

21

完全なソリューション。仕上げを始める。

これを index.php ページでのみ動作させたい場合は、サーバーに更新を非同期 (AJAX スタイル) で送信して、$_SESSION["userid"]まだオンラインであるサーバーに警告することができます。

setInterval("update()", 10000); // Update every 10 seconds

function update() {
  $.post("update.php"); // Sends request to update.php
}

update.php ファイルには、次のようなコードが含まれます。

session_start();
if ($_SESSION["userid"])
  updateUserStatus($_SESSION["userid"]);

これはすべて、ユーザーが Web サイトにログインするときにユーザー ID をセッション変数として保存することを前提としています。updateUserStatus() 関数は、次のような単純なクエリです。

UPDATE users 
SET lastActiveTime = NOW()
WHERE userid = $userid

そのため、ストレージを管理できます。次に、「オンライン」のユーザーのリストを取得します。このために、別の jQuery 呼び出しと別の setInterval() 呼び出しが必要になります。

setInterval("getList()", 10000) // Get users-online every 10 seconds

function getList() {
  $.post("getList.php", function(list) {
    $("listBox").html(list);
  });
}

この関数は、10 秒ごとにサーバーから HTML のビットを要求します。getList.php ページは次のようになります。

session_start();
if (!$_SESSION["userid"])
  die; // Don't give the list to anybody not logged in

$users = getOnlineUsers(); /* Gets all users with lastActiveTime within the
                              last 1 minute */

$output = "<ul>";
foreach ($users as $user) {
  $output .= "<li>".$user["userName"]."</li>";
}
$output .= "</ul>";

print $output;

これにより、次の HTML が出力されます。

<ul>
  <li>Jonathan Sampson</li>
  <li>Paolo Bergantino</li>
  <li>John Skeet</li>
</ul>

そのリストは、「list」という名前の jQuery 変数に含まれています。前回の jQuery ブロックをもう一度見てみると、そこにあることがわかります。

jQuery はこのリストを取得し、「listBox」というクラス名を持つ div 内に配置します。

<div class="listBox"></div>

これでうまくいくことを願っています。

于 2009-07-05T14:44:41.547 に答える
0

一般的なケースでは、ユーザーがいつページを離れたかを知る方法はありません。

ただし、ページ上にあるときにサーバーから頻繁に何かをロードするように、舞台裏で何かを行うことができます。<iframe>毎分リロードするコンテンツをロードすることによって:

<meta http-equiv="refresh" content="60">

これにより、サーバーに少し余分な負荷がかかりますが、必要な処理は実行されます(2番目に実行されない場合)。

于 2009-07-05T13:58:26.553 に答える
0

私はこれを試していないので、一粒の塩でそれを取る: ユーザーがページを離れたときにサーバーに通知する window.onunload のイベント ハンドラーを設定します。これに関するいくつかの問題は、1.) ブラウザーまたはコンピューターがクラッシュした場合にイベントが発生しないこと、および 2.) ユーザーがインデックス ページの 2 つのインスタンスを開いて 1 つを閉じた場合、参照カウントを実装しない限り、ログアウトしたように見えることです。 . これだけでは堅牢ではありませんが、Jonathan のポーリング方法と組み合わせると、応答時間がかなり長くなり、更新間の間隔が長くなります。

于 2009-07-05T15:16:20.123 に答える
0

さて、チャット機能はどのように機能しますか?ajax ベースのチャット システムですか?

Ajax ベースのチャット システムは、クライアントが常にチャット サーバーにアクセスして、キューに新しいメッセージがあるかどうかを確認することによって機能します。この場合、ユーザーのオンライン ステータスを Cookie または PHP セッションで更新できます (もちろん、PHP を使用していると仮定します)。次に、オンライン タイムアウトを更新頻度よりも少し長く設定できます。

つまり、チャット システムが通常 5 秒ごとにサーバーから新しいメッセージを要求する場合、10 ~ 15 秒間要求を送信していないユーザーはチャット ページにいないと見なすことができます。

ajax ベースのチャット システム (おそらく Java など) を使用していない場合でも、ユーザーがオンラインかどうかを確認するために定期的にサーバーに送信される ajax 要求を追加することで、同じことを実現できます。

このオンライン ステータス情報をデータベースに保存することはお勧めしません。誰がオンラインで誰がオンラインでないかを確認するために数秒ごとにデータベースにクエリを実行するのは、特にこれが大規模なサイトの場合、非常に多くのリソースを消費します。この情報をキャッシュし、キャッシュ (非常に高速) とデータベース (比較すると非常に遅い) で操作する必要があります。

于 2009-07-05T14:29:48.207 に答える
0

質問は「jquery」とタグ付けされています - JavaScript ソリューションはどうですか? meta/refreshの代わりにwindow.setInterval()を使用し、ajax-request を実行して、更新された「who's online」リストなどの「有用な」ものを提供できます (有用と考える場合は ;-))

于 2009-07-05T14:29:59.750 に答える
0

究極の解決策は、websocket で何かを実装することです。

于 2018-08-10T19:30:16.203 に答える