确定用户是否在线,否则关闭聊天室(php)


Determine if user is online otherwise, otherwise close chatroom (php)

我正在制作一个网站,它将有不同的聊天室。任何用户都可以随时创建聊天室,并且其他用户可以在聊天室可用时加入聊天室。最多两个用户可以同时在单个聊天室中聊天,但可以存在多个聊天室。

我正在使用AngularJS和PHP,以及用于聊天功能的PubNub API。创建的聊天室将存储在MySQL数据库中,其中包含以下字段:

  • 用户 1:创建聊天室的用户。如果它离开,它可能会改变或null
  • User2:它将首先null,并将存储加入聊天室的人员的用户名。
  • 关闭:当两个用户都离线时,它将为 true(1),则没有人可以再加入。

当任何用户离开聊天室时,我必须更新"user1"或"user2"列。然后,检查两个用户是否都处于脱机状态,然后更新关闭的值。

例如,我知道我可以通过每 60 秒通过 AJAX 调用一个 PHP 函数来保存用户的最后一个连接。即使我也可以通过检查其他用户在同一函数中的最后一个连接来检查他是否仍然在线,但是谁会调用该函数来检查最后一个用户是否离开?

想知道每次任何用户请求可用的聊天列表或我必须使用另一种方法解决它时,我是否都必须进行该验证。

我想每次用户加入/创建聊天室时,我都可以在 PHP 中设置超时函数。该函数将更新用户列以null,如果两者都null,则更新关闭值。当用户在聊天室中时,每 60 秒将调用另一个函数来推迟第一个函数。但我不知道这是否可能,以及使用共享主机是否可能。

希望您能帮助我,非常感谢您的关注。

PubNub Presence: Realtime vs Polling

答案是 - 不要轮询状态,而是让您的服务器使用 PubNub Presence Web Hooks 侦听频道状态的变化。请仔细阅读本文,因为它详细介绍了 PubNub 的 Presence Web Hooks 的所有方面,然后查看 PubNub Presence Web Hooks 的官方文档。在服务器上实现 REST 端点以接收 Web 钩子的示例代码是 Node,但如果需要,您可以使用该代码在 PHP 中实现它,但如果您可以将 Node 用于此目的,它可能是一个更好的选择(您仍然可以使用 PHP 进行其他所有操作)。

我知道您的服务器有一个聊天室创建过程,该过程会在您的数据库中插入新的聊天室记录,因此您无需知道频道何时变为活动状态,但是当用户 1 订阅聊天室频道时,如果您需要知道何时发生,PubNub 将通过 Web 挂钩将频道活动事件发送到您的服务器。

当用户 2 订阅用户 1 的聊天室频道时,PubNub 将通过 Web 钩子向您的服务器发送一个加入事件,您的服务器可以使用该事件使用用户 2 的信息更新您的数据库。

同时,用户 1 和用户 2 将订阅聊天室频道并监视状态(而不是与hereNow轮询)并接收加入事件。当任一用户离开聊天室(取消订阅频道)时,PubNub 将通过 Web 挂钩将离开事件发送到您的服务器,并直接发送给仍在订阅的用户。

最后一个用户离开聊天室后,PubNub 将向您的服务器发送频道非活动事件,您的服务器可以调用其聊天室关闭进程来根据需要更新您的数据库。

这是一个相当高级的设计,还有一些其他细节需要考虑,但这里的消息是不要轮询 PubNub 以获取状态信息。仅使用 hereNow 获取频道的当前状态,并通过到服务器的 Web 挂钩或通过对客户端应用的状态/订阅来侦听此后的进一步状态事件。在实现中,您实际上订阅了状态(侦听状态事件),然后调用hereNow

为了更详细地讨论您的要求,因为它与PubNub有关,我建议您联系PubNub支持,让您与客户成功经理和解决方案架构师联系。