【问题标题】:Determine if user is online otherwise, otherwise close chatroom (php)确定用户是否在线,否则关闭聊天室(php)
【发布时间】:2016-07-14 15:46:16
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • 除非您使用 websockets,否则您拥有的唯一信号是最后一次请求的时间/日期。投票可能会有所帮助,但正如您发现的那样,它不会关闭聊天室。除了清理没有活跃用户的房间的计划任务之外,我没有看到一个好的解决方案。
  • 同意 Kevin 关于 websockets... -side.

标签: php angularjs chat pubnub


【解决方案1】:

PubNub 存在:实时与轮询

答案是 - 不要轮询是否存在,而是让您的服务器使用 PubNub Presence Web Hooks 监听频道存在的变化。请仔细阅读这篇文章,因为它详细介绍了 PubNub 的 Presence Web Hooks 的所有方面,然后查看 official documentation for PubNub Presence Web Hooks。在您的服务器上实现 REST 端点以接收 Web 挂钩的示例代码是 Node,但如果需要,您可以使用该代码在 PHP 中实现该代码,但如果您可以为此目的使用 Node,它可能是一个更好的选择(而且您仍然可以将 PHP 用于其他一切)。

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

user2 订阅 user1 的聊天室频道时,PubNub 将通过 web hook 和您的服务器向您的服务器发送 join 事件可以使用该事件用 user2 的信息更新您的数据库。

同时,user1user2 将订阅聊天室频道并监控状态(而不是使用hereNow 轮询)并接收加入 em> 事件,以及。当任一用户离开聊天室(取消订阅频道)时,PubNub 将通过网络挂钩向您的服务器发送 leave 事件,并直接发送给仍订阅的用户。

一旦最后一个用户离开聊天室,PubNub 将向您的服务器发送 channel inactive 事件,您的服务器可以调用它的 聊天室关闭 em> 根据需要更新数据库的过程。

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

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

【讨论】:

  • 其实,这是我期待的答案。
  • 我使用 PubNub 网站上的 angularjs 教程实现了聊天功能。我阅读了有关加入和离开事件的信息(在客户端收听),但对 Web Hooks 一无所知。看起来它可以解决问题。非常感谢。
猜你喜欢
  • 2021-09-21
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多