首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取登录用户列表( PHP )

获取登录用户列表( PHP )
EN

Stack Overflow用户
提问于 2013-03-11 09:33:49
回答 6查看 5.8K关注 0票数 1

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

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

在用户登录时,我将将user_id插入到tbl_logged_users,在注销时,我将删除该记录。

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

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

谢谢。

我正试图找到这方面的最佳方法,因为确切的应用程序不是真正的基于聊天的应用程序,我有一个具有平均80,000记录的表/s。轮询/彗星运行时间约5-10秒。

编辑

有一些关于session_id的答案。我认为,除非有新的请求,否则它没有用,因为会话超时php不能自动更新数据库表。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-03-11 10:32:06

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

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

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

如果您正在创建聊天应用程序,尝试websockets,您将不会后悔。

票数 2
EN

Stack Overflow用户

发布于 2013-03-11 09:46:18

这是我的聊天应用程序中的会话检查程序代码。

$CONFIG"app:maxLatency“是以秒为单位的时间。在此之后,如果客户端不与服务器联系,客户端将被注销。

您需要一个名为users的表,该表包含id (整型)、lastseen (时间戳)和sid (会话id、文本)。

样本表:

代码语言:javascript
复制
id     |   lastseen                |  sid
--------------------------------------------------
123    |   2013-03-11 11:00:00     |  abcdefg12345

样本代码:

代码语言:javascript
复制
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;
}
票数 2
EN

Stack Overflow用户

发布于 2013-03-11 09:46:08

在日志记录时将会话id存储在表中,并在正常间隔内继续检查会话id,以便状态用户处于联机状态,如果用户关闭浏览器会话id不匹配,则注销用户。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15335155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档