看看我的 users
mysql 表。
id|active|
这些是 active
值的含义。
0-Offline
1-Online
2-Idle
- 每当有人登录时,我都会更新
active
列并将其设置为1。
- 每当有人注销时,我都会更新
active
列并将其设置为
0。
虽然这可能会发生,例如有人在未注销的情况下关闭浏览器或可能会断电。然后 logout.php
没有发生,它表明用户仍然活跃。
我想阻止这件事。如果发生这种情况,我希望 active
表更新为 2
。但如果用户在 5 小时 内没有再次登录,则更新为 0
。
我也不希望每分钟有太多的 ajax 请求。
Cron 解决方案
cron 文件中的查询
UPDATE users SET active = 2 WHERE time < (time() - 900);
UPDATE users SET active = 0 WHERE time < (time() - 18000);
如果您需要某种形式的实时状态,比如说用户访问了一个页面但没有离开它(并且没有关闭浏览器),那么您可以创建一个设定的时间间隔来更新它们,比如每 15 分钟一次。
关键是,给自己一些平均估计。试图以每秒为基础实时检测谁到底在线对 ajax 不好,它不是为此目的而构建的,你应该研究像 NodeJS/Websockets 这样的东西。但是,如果 5、10 或 15 分钟的余地是可以接受的“猜测”,那么它非常简单。
在查询解决方案
或者
如果您不能使用 cron(共享主机),那么您可以完全关闭时间而不是事件状态。因此,当您查询以显示谁在线时,您将在 SQL 查询中执行 if 条件以确定他们的事件状态应该是 0、1 还是 2,请阅读 http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html为此
select
username,
CASE
WHEN active_time > (UNIX_TIMESTAMP(now()) - 900) THEN 1
WHEN active_time > (UNIX_TIMESTAMP(now()) - 18000) THEN 2
ELSE 0
END AS active_state
FROM users
ORDER BY active_time DESC
如果你不想离线查询,你可以添加WHERE active_time > (UNIX_TIMESTAMP(now()) - 18000)
,之所以不添加到where on active_state是因为之前需要计算where可以做,而active_time是一个字段,在select计算之前可以先过滤,减少MySQL资源。
使用 unix 时间戳存储您的事件时间,使用 UNIX_TIMESTAMP(now())
或 PHP 的 time()
这将返回用户及其各自的事件状态,虽然这是一个选择,但您可以完全根据时间过滤结果,而不依赖于事件状态是特定数字。