1

我正在创建一个简单的实时聊天应用程序,所以我必须chatBuddyList在页面右侧显示。

目前我有 2 个用户表,tbl_users( user_id,name,email...) 和tbl_logged_user(id, user_id)。

在用户登录时,我将插入user_idtbl_logged_users并注销时,我将删除该记录。

一切都很好,但问题在于Logout。当用户点击logout链接时它会起作用,但有时用户可能会由于会话到期、浏览器关闭等原因自动注销......

我该如何处理这种情况?实现这一目标的最佳方法是什么?

谢谢。

我正在尝试为此找到最佳方法,仅仅是因为确切的应用程序不是基于真正聊天的应用程序,我有一个包含平均80,000记录的表。轮询/彗星运行大约 5-10 秒的时间范围。

编辑

有一些答案说session_id。我认为它没有用,因为会话超时 php 无法自动更新数据库表,除非有新请求。

4

6 回答 6

2

这是我的聊天应用程序中的会话检查器代码。
$CONFIG["app:maxLatency"] 是以秒为单位的时间。在此时间之后,如果客户端没有联系服务器,客户端将被注销。
您需要一个名为 users 的表,其中包含 id(整数)、lastseen(时间戳)和 sid(会话 id、文本)

样品表:

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 回答
2

好吧,这不是解决问题的“通常”方式,但我认为这不是一个糟糕的解决方案:

例如,您可以使用带有小型 Node.js 服务器的 websocket。当用户使用有效会话加载页面时,它会连接到服务器(只有两行 javascript)。当它断开连接(关闭页面)时,websocket 中断并且服务器捕获事件。

如果用户关闭浏览器,套接字将断开连接。如果用户单击注销,页面会重新加载,然后不会再次创建套接字(没有有效的会话)。唯一的问题是当用户长时间打开浏览器并且会话过期时。好吧,在服务器中添加超时可以解决这个问题。

如果您正在创建一个聊天应用程序,请尝试使用 websockets,您不会后悔的。

于 2013-03-11T10:32:06.833 回答
1

记录时将会话 ID 存储在表中,并定期检查会话 ID,以说明用户在线,如果用户关闭浏览器会话 ID 将不匹配,则注销用户。

于 2013-03-11T09:46:08.557 回答
0

考虑一个登录的用户,如果他在最后 5 分钟(左右)内处于活动状态。这就是几乎每个网站处理它的方式。您可以在用户每次“做”某事时注册一个时间戳(即在您的聊天框中发送消息)

于 2013-03-11T09:35:45.087 回答
0

只需将状态添加到用户表。登录时将状态更新为 1,注销时重置为 0。然后每隔 5 或 10 秒使用 AJAX 从用户表中选择 status = 1 的所有结果。创建一个 users_online div 并显示结果。

于 2021-10-27T06:53:09.273 回答
-1

如果您在表中维护会话,只需计算表中的活动会话数。

于 2013-03-11T09:43:52.827 回答