1

我正在尝试创建一个允许用户“登录”和“注销”的小型 Web 应用程序。我目前遇到的问题是允许客户端向服务器发送恒定的“心跳”或消息以通知它仍然处于活动状态。

这更像是一个逻辑问题。我想要做的是在 php 中有一个 while(1) 循环来检查是否跳过了 n 个心跳。我仍然希望客户端和服务器能够在这个循环进行时进行交互(本质上我希望服务器表现得好像它有一个单独的“check_for_heartbeats”线程。

如何使用 php 实现这一目标?我现在正在运行 XAMPP。任何帮助将非常感激。

编辑:为了澄清,我想要做的是能够捕捉浏览器关闭事件,即使在 window.unload 事件不会触发的情况下(例如客户端与互联网断开连接)。在这种情况下,有一个线程来监控心跳似乎是最直观的解决方案,尽管我不确定如何在 php.ini 中实现它。

编辑 2: isLoggedIn() 只是辅助函数,用于检查是否设置了会话布尔变量 ($_SESSION['is_logged_in'))。

最后编辑:好的,所以我现在完全理解评论和回复的意思了。换句话说,这里是潜在的解决方案:让 Javascript 代码向服务器发送“心跳”。服务器将添加与这些节拍关联的时间戳。修改数据库以保存这些时间戳查询整个“时间戳”表(更可能是具有“时间戳”属性的“用户”表),并查看 NOW 和最后一个时间戳之间的差异是否大于某个阈值。“注销”任何超过此阈值的用户。

唯一的问题是如果只有一个用户登录,或者所有用户同时断开连接 - 但在这些情况下,没有其他人会看到用户断开连接。

这是多个响应的组合,但我认为克里斯的响应解决了大部分问题。感谢 chris 和 Alex Lunix 的有益贡献。:D

这是一个更好的解释的代码片段

服务器端:

function checkBeats()
{
    while(isLoggedIn())
    {
        // it's been > 30 secs since last heartbeat
        if((time() - $_SESSION['heartbeat']) > 30)
        {
            logout();
            break;
        }
    }
}
4

2 回答 2

2

我通常做的是使用 javascript (jQuery) 调用 php 文件并更新数据库或任何你喜欢的东西。这个问题可能会回答你的问题:确定用户是否在线的最简单方法是什么?(PHP/MYSQL)

于 2012-02-12T03:05:17.300 回答
1

您可以使用 ajax 对更改 heartbeats 会话变量的脚本进行检测,然后在每个脚本的顶部执行此检查(当然,将其放入函数中并调用它):

// it's been > 30 secs since last heartbeat
if((time() - $_SESSION['heartbeat']) > 30)
{
    logout();
}

编辑:如果您希望数据库立即反映该状态,而不是在他们下次访问该页面时,您将需要使用 MySQL。在不使用其他程序(例如 java 程序)来检查数据库的情况下,我唯一能想到的就是在每个页面的顶部添加它(当然是在一个被调用的函数中):

mysql_query("UPDATE `users` SET `loggedin`=0 WHERE heartbeat<".time()-30);

这将更新每个用户,这意味着登录值的准确性将由页面浏览频率设置。

于 2012-02-12T03:05:19.287 回答