1

簡単なリアルタイムチャットアプリケーションを作成しているのでchatBuddyList、ページの右側にを表示する必要があります。

tbl_users現在、ユーザー用に(user_id、name、email ...)とtbl_logged_user(id、 )の2つのテーブルがありますuser_id

ユーザーログイン時ににを挿入しuser_idtbl_logged_usersログアウト時にそのレコードを削除します。

すべてが正常ですが、問題はにありLogoutます。ユーザーがlogoutリンクをクリックすると機能しますが、セッションの有効期限、ブラウザの終了などにより、ユーザーが自動的にログアウトする場合があります...

どうすればそのような状況に対処できますか?そして、これを達成するための最良の方法は何でしょうか?

ありがとう。

私はこれに最適な方法を見つけようとしています。正確なアプリケーションは実際のチャットベースのものではないため、80,000レコードの平均を含むテーブルがあります。そして、ポーリング/彗星は約5-10秒の時間枠で実行されています。

編集

について言っているいくつかの答えがありますsession_id。セッションタイムアウトphpは、新しいリクエストがない限り、データベーステーブルを自動的に更新できないため、役に立たないと思います。

4

6 に答える 6

2

まあ、これは問題を解決する「通常の」方法ではありませんが、悪い解決策ではないと思います。

たとえば、小さな Node.js サーバーで websocket を使用できます。ユーザーが有効なセッションでページをロードすると、サーバーに接続されます (javascript の 2 行のみ)。切断する (ページを閉じる) と、websocket が壊れ、サーバーがイベントをキャッチします。

ユーザーがブラウザーを閉じると、ソケットは切断されます。ユーザーがログアウトをクリックすると、ページがリロードされ、ソケットは再度作成されません (有効なセッションがありません)。唯一の問題は、ユーザーが長時間ブラウザを開いたままにし、セッションが期限切れになった場合に発生します。サーバーにタイムアウトを追加すると、これが解決します。

チャット アプリケーションを作成している場合は、websockets を試してみてください。後悔することはありません。

于 2013-03-11T10:32:06.833 に答える
2

これは、チャット アプリケーションのセッション チェッカー コードです。
$CONFIG["app:maxLatency"] は秒単位の時間です。この時間が経過すると、クライアントがサーバーに接続しなかった場合、クライアントはログアウトされます。
id (整数)、lastseen (タイムスタンプ)、および sid (セッション ID、テキスト) を持つ users というテーブルが必要です。

サンプルテーブル:

id     |   lastseen                |  sid
--------------------------------------------------
123    |   2013-03-11 11:00:00     |  abcdefg12345

サンプルコード:

function DeleteSessionByUserId($user_id) {
    $user_id = mysql_real_escape_string($user_id);
    global $CONFIG;

    $sql = "UPDATE users SET sid = '' WHERE id = '".$user_id."'";
    $result = mysql_query($sql);
    return true;
}

// This will delete all users with expired sessions
function CheckAllSessionsExpired() {
    global $CONFIG;

    $sql = "SELECT id FROM users WHERE sid != '' AND lastseen < '".date("Y-m-d H:i:s", strtotime("-".$CONFIG["app:maxLatency"]." seconds"))."'";

    $result = mysql_query($sql);
    while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
        DeleteSessionByUserId($line['id']);
    }
    return true;
}

// This will update the last seen timestamp in MySQL
function UserSetSeen($user_id) {
    $user_id = mysql_real_escape_string($user_id);

    global $CONFIG;
    $sql = "UPDATE users SET lastseen = '".date("Y-m-d H:i:s")."' WHERE id = '".$user_id."';";
    $result = mysql_query($sql);
    return true;
}
于 2013-03-11T09:46:18.270 に答える
1

ログ記録中にセッション ID をテーブルに保存し、定期的にセッション ID をチェックし続けて、ユーザーがオンラインであることを示します。ユーザーがブラウザーを閉じると、セッション ID が一致しなくなり、ユーザーをログアウトします。

于 2013-03-11T09:46:08.557 に答える
0

過去 5 分間 (またはそれくらい) アクティブだったユーザーがログインしたとします。これは、ほとんどすべての Web サイトがそれを処理する方法です。ユーザーが何かを「行う」(つまり、チャットボックスでメッセージを送信する) たびに、タイムスタンプを登録することができます。

于 2013-03-11T09:35:45.087 に答える
-1

テーブルでセッションを維持している場合は、テーブル内のアクティブなセッションの数を数えるだけです。

于 2013-03-11T09:43:52.827 に答える