我正在创建一个简单的实时聊天应用程序,因此我必须在页面右侧显示chatBuddyList
。
目前我有2个用户表,tbl_users
(user_id
,姓名,电子邮件...)和tbl_logged_user
(id,user_id
)。
在用户登录时我会将user_id
插入tbl_logged_users
并在注销时删除该记录。
一切都很好,但问题在于Logout
。当用户点击logout
链接时,它会起作用,但有时用户可能会因会话到期,浏览器关闭等原因自动退出...
我该如何处理这种情况?什么是达到这个目标的最好方法?
感谢。
我正在尝试找到最好的方法,因为确切的应用程序不是真正的基于聊天的应用程序,我有一个平均
80,000
个记录的表。轮询/彗星的运行时间约为5-10秒。
修改
关于session_id
,有一些答案。我相信它没有用,因为除非有新的请求,否则php无法自动更新数据库表。
答案 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)
如果您在表中维护会话,只需计算表中的活动会话数。