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

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

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

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

当任何用户离开聊天室时,我必须更新列 "user1" 或 "user2"。然后,检查两个用户是否离线,然后更新关闭值。

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

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

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

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

PubNub 状态:实时与轮询

答案是 - 不要轮询状态,而是让您的服务器使用 PubNub Presence Web Hooks. Please read this article thoroughly as it details all the aspects of PubNub's Presence Web Hooks and then review the official documentation for PubNub Presence Web Hooks 监听频道状态的变化。在您的服务器上实现 REST 端点以接收 Web 挂钩的示例代码是 Node,但如果需要,您可以使用该代码在 PHP 中实现它,但如果您可以将 Node 用于此目的,它可能会更好选择(您仍然可以对其他所有内容使用 PHP)。

我知道你的服务器有一个聊天室创建过程,它会在你的数据库中插入新的聊天室记录,所以你不需要知道频道何时激活,但何时user1 订阅了聊天室频道,PubNub 将通过网络挂钩向您的服务器发送一个 channel active 事件,如果您需要知道什么时候发生了。

user2订阅user1的聊天室频道时,PubNub会发送一个join 事件通过网络钩子发送到您的服务器,您的服务器可以使用该事件使用 user2 的信息更新您的数据库。

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

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

这是一个相当高级的设计,还有一些其他细节需要考虑,但这里的消息是不要轮询 PubNub 以获取在线信息。仅使用 hereNow 获取频道的当前存在状态,并通过网络挂钩到您的服务器或通过 presence/subscribe 到您的客户端应用程序监听从该点开始的更多存在事件。在实现中,您实际上订阅了在线状态(监听在线状态事件),然后调用 hereNow.

要更详细地讨论您与 PubNub 相关的要求,我建议您联系 PubNub Support 让您与客户成功经理和解决方案架构师取得联系。