获取登录用户PHP列表

时间:2013-03-11 09:33:49

标签: php javascript mysql ajax session

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

目前我有2个用户表,tbl_usersuser_id,姓名,电子邮件...)和tbl_logged_user(id,user_id)。

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

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

我该如何处理这种情况?什么是达到这个目标的最好方法?

感谢。

  

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

修改

关于session_id,有一些答案。我相信它没有用,因为除非有新的请求,否则php无法自动更新数据库表。

5 个答案:

答案 0 :(得分:2)

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

样本表:

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;
}

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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