php - 检查用户是否在线。ajax 请求太多

标签 php jquery mysql ajax user-interface

<分区>

看看我的 users mysql 表。

id|active|

这些是 active 值的含义。

0-Offline
1-Online
2-Idle
  • 每当有人登录时,我都会更新active列并将其设置为1
  • 每当有人注销时,我都会更新active列并将其设置为 0

虽然这可能会发生,例如有人在未注销的情况下关闭浏览器或可能会断电。然后 logout.php 没有发生,它表明用户仍然活跃。

我想阻止这件事。如果发生这种情况,我希望 active 表更新为 2。但如果用户在 5 小时 内没有再次登录,则更新为 0

我也不希望每分钟有太多的 ajax 请求。

最佳答案

Cron 解决方案

  • 每次用户访问页面/浏览网站时,您都会将它们更新为 active = 1 并输入 time=time();

    /li>
  • 创建一个 cron 脚本来更新所有时间低于特定数量的用户,您可以每 15 分钟运行 1 个 cron,其中可以包括两个查询(因为它会在 5 小时时勾选那些时间命中)

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()

这将返回用户及其各自的事件状态,虽然这是一个选择,但您可以完全根据时间过滤结果,而不依赖于事件状态是特定数字。

关于php - 检查用户是否在线。ajax 请求太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23681047/

相关文章:

php - 如何从每个父模型的模型中获取 N 条记录?在 Laravel Eloquent 中

javascript - 如何更改每个 href 和 src url 路径的第一部分?

php - stream_socket_enable_crypto();禁用 stream_set_timeout

php - 奇怪的preg_replace行为将字符变成数字

javascript - jquery从不同页面调用按钮

php - Owl Carousel - Magento 产品

mysql - 当后端升级到 MySQL 时,连接中带有 varchar 字段的可编辑 MS Access 查询不再可编辑

mysql - SQL select with with multiple rows for a ID

jquery - 获取具有事件类(class)的类(class)ID?

mysql - 当表中有多个带有 col val1 的行时,如何从列值 2 中不包含特定值的表中获取不同的列 value1?