【问题标题】:Check if user is online or not .Too many ajax requests [closed]检查用户是否在线。太多的ajax请求[关闭]
【发布时间】:2014-07-04 01:35:48
【问题描述】:

看看我的users mysql 表。

id|active|

这就是active 值的含义。

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

虽然它可能会发生,就像有人在没有注销自己的情况下关闭浏览器或断电一样。然后logout.php 没有出现,它表明用户仍然处于活动状态。

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

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

【问题讨论】:

  • 这就是我要你们帮助@JayBlanchard

标签: php jquery mysql ajax user-interface


【解决方案1】:

Cron 解决方案

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

  • 创建一个 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 &gt; (UNIX_TIMESTAMP(now()) - 18000),之所以不用where on active_state是因为需要先计算where才能做where,而active_time是一个字段,可以在选择计算,减少MySQL资源。

使用 UNIX_TIMESTAMP(now()) 或 PHP 的 time() 使用 unix 时间戳存储您的活动时间

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

【讨论】:

  • @HackerManiac 一个 cron 脚本允许你告诉你的服务器以特定的时间间隔运行一个“作业”,在这种情况下,我们会告诉它每 15 分钟运行一个 PHP 文件,然后 PHP 文件将包含这两个查询。用谷歌搜索“Cron”并查看cyberciti.biz/faq/…
  • 说我有一个 PHP 文件 cronevery5.php 包含这 2 个查询。那么我将如何、在哪里以及通过哪种方法每 5 小时运行一次呢?
  • @HackerManiac 您可能希望每 15 分钟运行一次,以确保更频繁地设置空闲并且在您的站点上更明显。阅读此内容:cyberciti.biz/faq/… 它会解释。您需要通过 SSH 访问您的服务器并能够修改 crontab
  • 我正在使用 Windows! @viion
  • Windows 有一个任务计划程序。 windows.microsoft.com/en-US/windows/schedule-task#1TC=windows-7 如果你的服务器是 IIS 服务器,它也有一个内置的任务计划程序。
【解决方案2】:

您可以创建自己的会话处理程序。 --> session_set_save_handler
将会话存储在这样的数据库中:Link

然后您可以在_destroy 函数中使用SQL 调用数据库,将active 列设置为0。

这意味着当会话结束时(浏览器关闭,或者会话过期)session_set_save_handler 调用_destroy 函数

【讨论】:

    【解决方案3】:

    您不需要很多 ajax 请求。您可以每几分钟执行一个请求,并将请求的时间保存在用户配置文件中。 您可以为脚本运行 CRON 作业,该脚本检查每个用户的状态为 1(在线),如果上次请求时间太久,您可以将用户的状态更改为您想要的任何状态。

    【讨论】:

    • 我将如何做 CRON 工作 @banti
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2021-06-25
    • 1970-01-01
    • 2012-01-20
    • 2023-02-14
    相关资源
    最近更新 更多