0

現在そのページを見ているすべてのユーザーを表示するページを作成したいと考えています。理想的には、ページにアクセスしているユーザーをデータベースに保存し、ユーザーが出入りするときに Websocket を使用して更新します。

問題は、ユーザーがいつページを表示しているかを知る方法がわからないことです。彼らがいつ到着し、いつ退出したかを判断し、それに応じて追加/削除できると考えていました。彼らがいつ到着するかは簡単にわかります。ただし、ユーザーが複数のタブを開き、1 つを閉じてもう 1 つを開いたままにしておくなどの操作を行う可能性があるため、ユーザーがいつ離れたかを判断するのは困難です。

これを行う最善の方法は何ですか?サーバー側の言語として PHP を使用しています。

4

5 に答える 5

1

ええと、特にWebSocketを使用している場合にできることのひとつは、本当に必要な場合は、数秒ごとにサーバーにハートビート/pingを実行することです。あなたがそのハートビートを受け取らなければ、あなたは彼らがもうページにいないことを知っています....しかし、応答を得ることは彼らがページを見ていることを意味しません、それは単にそれが開いていることを意味します、おそらく別のものでタブ。その人がページにフォーカスを失い、別のタブ/ウィンドウを開いた場合にサーバーに応答を送信することを私が知っている方法はありません。

于 2012-08-02T23:47:58.823 に答える
1

ティムが述べたように、Firefox と IE はバックグラウンド タブで JavaScript を実行するため、ユーザーが実際にページを「見ている」のか、どこかで開いているのかを単純なポーリングで確実に判断する方法はありません。ユーザーが実際にあなたのページを見ているかどうかを知る方法はわかりませんが、潜在的な解決策は、ポーリングをアクションにバインドすることです。だからあなたはいくつかの変数を持っているかもしれません

var timesincelastaction=0;
var threshhold = 20;

それで

setInterval("timesincelastaction++",100);

それで

function keepAlive() {
  if(timesincelastaction > threshhold) {
    $.ajax(...tell the server you are alive...);
    timesincelastaction = 0;
  }
}

次に、次のようなアクションを考え始めます

$('a').mouseover(keepAlive);
$('div').mouseover(keepAlive);
$(window).scroll(keepAlive);
$(video).play(keepAlive); // okay this isn't a real one but you get the picture

そのため、ユーザーがページ上で行う可能性のある、注意が必要なすべてのことについてブレインストーミングを行い、それらをベンチマークとして使用します。

これは私が知っている少し激しいようですが、おそらくそれを最適化するためのいくつかの良い方法があります. 大声で考えているだけです。他の人が何を考え出すのか興味があります。

于 2012-08-03T00:13:00.207 に答える
0

PHPスクリプトのいずれかが実行されるたびに、一部のユーザーまたはエンティティがサイトのページの表示を要求しました(これは通常、スクリプトが実行されるたびに発生します)。

ユーザーがページを離れたことを検出するのはより困難です。そのため、ほとんどのオンラインインジケーターは単にタイムアウトになります。つまり、過去5分間にウェブサイトでアクティブでなかった場合、オンラインとは見なされなくなります。

$ _SERVER ['REMOTE_ADDR']などの変数を使用してページをリクエストしたユーザーに関する情報を取得できます。または、すでに認証システムを使用している場合は、ユーザーのユーザー名を取得できるはずです。この情報をユーザー名/ipでデータベースに保存します。タイムスタンプ付きの一意のキーとして使用し、タイムスタンプが5分より古い場合は、オンラインとしてカウントしないでください。

于 2012-08-02T23:43:44.340 に答える
0

おそらく jQuery- ajaxunloadおよびload. ajaxリクエストは、load視聴していることを伝えるとトリガーされ、視聴してunloadいないことを伝えるとトリガーされます。あなたはすでにそれを把握しているように聞こえるので、残りはあなたに任せられます.

ノート。プレーンJSでも同じ結果が得られるはずです。などonunload。残りは Google が見つけてくれます。

于 2012-08-02T23:50:08.173 に答える