2

特定の Web ページでユーザーのアクティビティを監視する方法はありますか? 私がしたいのは、特定のユーザーが現在フォーラムでアクティブかどうかを確認することです。アクティブでない場合、ユーザーはフォーラムに不在として表示される必要があります

 $sql   =   "SELECT * FROM forumlog WHERE user_id = ".$_SESSION['user_id'];
 $result    =   mysql_query($sql) or die(mysql_error());

if(mysql_num_rows($result) == 0){
        $sql   = "INSERT INTO forumlog (course_id, user_id, log_time)
                VALUES(
                ".$_GET['course_id'].",
                ".$_SESSION['user_id'].",
                ".time().")";
       $result    =   mysql_query($sql) or die(mysql_error());
}

上記のコードは、ユーザーをフォーラムにログインするために使用するものです。これは、フォーラムが私のサイトの単なるページであり、ユーザーがフォーラムのリンクをクリックするまでログインしないためです。フォーラム ページからユーザーをログアウトする方法、またはユーザーがそのフォーラムでアクティブかどうかを確認する方法

4

4 に答える 4

3

ユーザーがページに入ると、時間をデータベースに入れることができます。彼がページを更新するたびに、今度は更新する必要があります。

どのユーザーがアクティブかを確認するには、「時間」が 5 分未満のデータベース ユーザーを選択する必要があります。

どのユーザーが欠席しているかを確認するには、時間が 5 分を超えているユーザーを確認する必要があります。

5分コースはお好みの値に変更可能です。

より具体的にしたい場合は、Web サイトでアクションに名前を付けて、次のような構造でデータベースに配置できます。

id, user_id, datetime, action, params

レコードを入れて

1, NOW(), 4,  "viewforum", "forum_id=4,post_id=6"

過去 5 分間のアクティビティを選択し、オンラインの user_id で確認できます。

于 2013-04-30T09:43:49.563 に答える
2

これを行う従来の方法はすでに説明されています (ユーザーがコンテンツをロードするたびに「last_activity」フィールドを更新します)。

これを行うためのまったく別の方法を指摘します: websockets

ご存じのとおりhttp、リクエストとレスポンスの方法で機能します。接続はクライアントによって作成され、応答が送信された後に閉じられます (常にではありませんが、キープアライブによって異なります)。したがって、あなたの問題 (「ユーザーがまだそこにいるかどうかをどうやって知ることができますか?」) は、これを受け入れない限り解決できませ

クライアントまたはサーバーが切断する時が来たと判断するまで接続が閉じられないため、ここでは websocket が有利です。そのため、ユーザーがフォーラムに入ったときに接続を開き、クライアントがページを離れるかブラウザを閉じて接続が閉じられるまでそのままにしておくことができます。

悪いニュース: これらの接続をリッスンするサーバーを作成する必要があります。たとえば、Node.js を使用します。難しいことではありませんが、サーバーへのルート アクセスが必要で、数行のコードを記述します。

従来の方法は簡単で、SQL クエリにすぎませんが、代替手段について知っておくとよいでしょう。

編集

簡単な例

  1. Node.js をインストールします: http://nodejs.org/
  2. socket.io をインストールします (これは node.js モジュールです): http://socket.io/
  3. 次のような単純なサーバーを作成します。
var socketsConnected = 0;
var io = require('socket.io').listen(8080);
io.sockets.on('connection', function (socket) {
    socketsConnected++;
    // send him some information
    socket.emit('totalSocketsOnline', { counter: socketsConnected });
    // let the others know that the counter has changed!
    socket.broadcast.emit('totalSocketsOnline', { counter: socketsConnected });

    // socket events
    socket.on('disconnect', function () {
        console.log("Socket disconnected");
        socketsConnected--;
        // again, notify all clients!
        socket.broadcast.emit('totalSocketsOnline', { counter: socketsConnected });
    });
});

 4- 次のような単純なクライアントを作成します。

<script src="http://yourdomain.com:8080/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect('http://yourdomain.com:8080');
    socket.on('connect', function (data) {
        // connected, we are so happy...
    });
    socket.on('totalSocketsOnline', function (data) {
        // wohohoo lets show how many sockets we have online now
        alert("We have "+data['counter']+" sockets online now!");
    });
</script>

私はそれをコーディングしたばかりなので、おそらくエラーが含まれていて機能しないでしょうが、ここから始めましょう。

于 2013-04-30T09:59:18.180 に答える
1

少しのストレスを乗り越えることができれば、ポーリングを使用してサーバーへのオープン接続を確立し、マウスの配列位置を 30 秒間返すことができます。位置が前の 30 秒間と同じままである場合は、ユーザーは現在アクティブではありません。ユーザーをログアウトするためのスクリプトを作成できます.....まあ、ただ言っているだけです....

于 2013-11-22T08:19:19.493 に答える