我为这些东西狂欢了很多,但找不到直接的答案,我在这里搜索过这个,
但我仍然用头撞墙试图实施,
会话过期后如何更新查询?我不是在谈论显式单击"注销"按钮
以下是基本的 SQL 结构:
CREATE TABLE auth_users (
email varchar(40) NOT NULL,
password varchar(40) NOT NULL,
online ENUM('1') DEFAULT NULL <-- HERE, it updates to 1 when user logged in, it updates back to NULL when user explicitly clicks on LOGOUT
) type=MyISAM;
类层次结构:
interface {
function login();
function logout();
//calls after succes authorization
function set_as_online();
//calls from within logout() method
function set_as_offline();
}
但是当用户关闭浏览器时,它不会更新回 NULL,
例如假设我们有两个用户:用户 A、用户 B
用户 A 已成功登录,现在用户 B 可以将用户 A 视为在线用户。
如果用户 A 忘记单击"注销"并关闭其浏览器,用户 B 仍可将用户 A 视为联机。这就是问题所在。
例如Facebook很好地处理了这一点,
假设您的朋友刚刚关闭了浏览器(即他的会话不再存在(,然后不知何故,您可以看到他处于离线状态
我做错了什么?处理离线/在线用户的方法不正确?
这里需要另一种方法。不要设置在线/离线标志,而是设置"last_seen"时间戳。即。对于每个请求,将记录更新为当前时间戳。如果您想知道用户是否在线,只需执行以下操作:
if($current_time - $last_seen_time < $session_expire_limit) {
// online
} else {
// offline
}
否则,您需要某种 cronjob 在一段时间后自动重置数据库中的 online
标志,但您仍然需要一个last_seen
列。
//编辑
我不知道Facebook是如何做到的,但它可能是以下之一;对于聊天和通知功能,Facebook打开了一个"流",这实际上是一个小的Ajax调用,由服务器保持活动状态(顺便说一句,这个Ajax调用每40秒刷新一次(。此流可能用于跟踪在线用户。另一种选择(但可能性较小(是将事件附加到 window.unload 事件。这不太可能,因为页面刷新,单击指向另一个Facebook页面的链接等也会触发事件。这意味着每次点击内部Facebook链接时,该事件都应从浏览器中取消绑定。想不出另一种方式的自动取款机,只是一些建议。不幸的是,这些实施起来非常繁重,我认为我上面的建议(在编辑之前(应该适合一个普通的网站。
我不确定Facebook如何控制这些东西,但我可以从我的头顶上建议你如何处理这个问题。
我会在您的 Date 类型的auth_users表上添加一个表示session_expiry_time的新字段。
然后在你的html页面中,你应该实现一些无声的ajax代码,这些代码将在服务器上调用一个虚拟的php页面(间隔是非常重要的,因为你必须平衡性能和功能(。此虚拟页面将更新用户session_expiry_time在auth_users表。
因此,在任何给定时间,根据当前时间检查用户的session_expiry_time将确定用户是否在线。
http://de2.php.net/manual/en/features.connection-handling.php您可以使用register_shutdown_function((和connection_aborted((实现您的意图
在页面上使用简单的JavaScript
在正文标签中
callLogoff(( 应该替换为调用 log off 的 JavaScript 函数。
试试吧。