2013-01-03 5 views
5

nodejssocket.ioを使用してチャット機能を持つPHPアプリケーションがあります。 私が今必要とするのは、ユーザーが15分以上休眠している場合にユーザーをログアウトすることです。Socket.ioクライアントからのハートビートを除いて非アクティブであることを確認します。

セッションは、PHPアプリケーションとNodejsサーバで共有されます。したがって、nodejsサーバは、ユーザが最後にログインしたときまたは最後のアクティビティがいつだったかを知る。

私はlogoffコマンドをsocket.ioクライアントに送信することを考えています。クライアントからのハートビートとメッセージを区別できるのは本当に簡単です。

PHPアプリケーションは、ページのリロードやナビゲーションでユーザーのアクティビティのみを知っているため、休止状態の間はチャットしている可能性があり、PHPアプリケーションはユーザーがチャットしているかどうかを知ることができません。したがって、セッションの最後のアクティビティを確認することはできません。

ここでの主な質問は、15分以上(送信しない)ハートビートのみを送信しているクライアントを特定できますか?

+0

チャットのアクティビティに基づいてセッションを更新することはできません。次のハートビートで15分のアクティビティがない場合は、ログアウトしますか? – mekwall

答えて

5

チャットアクティビティに基づいてログオフする最も簡単な方法は、ユーザーがチャットするたびにリセットされる簡単なタイマーを設定することです。

io.sockets.on('connection', function(socket) { 
    // ... 
    var logoffTimer; 
    socket.on('chat', function() { 
     // clear the timer on activity 
     // should also update activity timestamp in session 
     clearTimeout(logoffTimer); 
     // set a timer that will log off the user after 15 minutes 
     logoffTimer = setTimeout(function(){ 
      // add log off logic here 
      // you can also check session activity here 
      // and perhaps emit a logoff event to the client as mentioned 
      socket.emit("logoff", { reason: "Logged off due to inactivity" }); 
     }, 60 * 15); 
    }); 
}); 
+0

これを少し変更して、すべてのクライアントに適用できるようにする必要があります。上記のコードでは、どのユーザーのアクティビティも 'logoffTimer'をリセットします。接続ソケットに固有のものでなければなりません。 – Broncha

+0

@Broncha Hmmm。本気ですか?接続するすべてのクライアントに対して 'connection'イベントがトリガーされ、' logoffTimer'がそのスコープで定義されます。 – mekwall

+0

@MarcusEkwallこれは完璧です!ほぼ3年後、それはまさに私が必要なものです、ありがとう! – Haring10

関連する問題