我正在创建一个简单的实时聊天应用程序,所以我必须在页面的右侧显示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不能自动更新数据库表。
发布于 2013-03-11 10:32:06
好吧,这不是解决问题的“通常”方法,但我认为这不是一个糟糕的解决办法:
例如,您可以在一个小型Node.js服务器上使用websocket。当用户用有效的会话加载页面时,它会连接到服务器(只有两行javascript)。当它断开连接(关闭页面)时,websocket中断,服务器捕获事件。
如果用户关闭浏览器,则套接字断开连接。如果用户单击“注销”,页面将重新加载,然后不会再次创建套接字(没有有效会话)。唯一的问题是当用户打开浏览器很长时间并且会话过期时。那么,在服务器中添加一个超时可以解决这个问题。
如果您正在创建聊天应用程序,尝试websockets,您将不会后悔。
发布于 2013-03-11 09:46:18
这是我的聊天应用程序中的会话检查程序代码。
$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-11 09:46:08
在日志记录时将会话id存储在表中,并在正常间隔内继续检查会话id,以便状态用户处于联机状态,如果用户关闭浏览器会话id不匹配,则注销用户。
https://stackoverflow.com/questions/15335155
复制相似问题