我正在尝试创建一个允许用户“登录”和“注销”的小型 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;
}
}
}