我为这些东西打了很多钱,但找不到直接的答案, 我在这里搜索了这个,
但是 我仍然在试图实施这个问题,但仍然在试图实施这一目标。
会话过期后如何更新查询? 我不是在谈论明确点击"退出"按钮
这里的基本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();
}
但是当用户关闭他的浏览器时,它不会更新回来,
例如, 假设我们有两个用户:User-A,User-B
用户A成功登录,现在用户B可以将用户A视为在线用户。
如果用户A忘记点击&#34; LOGOUT&#34;并关闭他的浏览器, user-B仍然可以将User-A视为ONLINE。这就是问题所在。
例如, Facebook处理得非常好,
假设您的朋友刚刚关闭浏览器(即他的会话不再存在), 那么你可以看到他离线
我做错了什么?处理离线/在线用户的方法不正确?
答案 0 :(得分:2)
我认为这里需要另一种方法。不要设置在线/离线标志,而是设置“last_seen”时间戳。 IE浏览器。每个请求都将记录更新为当前时间戳。如果您想知道用户是否在线,请执行以下操作:
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链接时,该事件应该从浏览器解除绑定。 想不出另一种方式atm,只是一些建议。不幸的是,实施这些工作非常费力,我认为上面的建议(在编辑之前)应该适用于一个共同的网站。
答案 1 :(得分:2)
我不确定facebook如何控制这些东西,但我可以从头脑中建议你如何解决这个问题。
我会在类型为Date的auth_users表中添加一个新字段,表示session_expiry_time。
然后在你的html页面中你应该实现一些静默的ajax代码,它将在服务器上调用虚拟的php页面(间隔是非常重要的,因为你必须平衡性能和功能)。此虚拟页面将更新用户的session_expiry_time auth_users表。
因此,在任何给定时间内,根据当前时间检查用户的session_expiry_time将确定用户是否在线。
答案 2 :(得分:0)
在页面上使用简单的JavaScript
在正文标记
中
callLogoff()应该用调用log off的JavaScript函数替换。
试试吧。
答案 3 :(得分:0)
http://de2.php.net/manual/en/features.connection-handling.php 你可以用register_shutdown_function()和connection_aborted()打算实现