我正在制作一个会有不同聊天室的网站。任何用户都可以随时创建聊天室,而另一个用户可以在聊天室可用时加入聊天室。最多两个用户可以同时在一个聊天室聊天,但可以存在多个聊天室。
我使用AngularJS和PHP,使用PubNub API进行聊天功能。创建的聊天室将存储在MySQL数据库中,包含以下字段:
null
。null
,并会存储用户加入聊天室的人的姓名。我必须更新列" user1"或" user2"当任何用户离开聊天室时。然后,检查两个用户是否都处于脱机状态,然后更新已关闭的值。
我知道我可以通过每隔60秒通过AJAX调用PHP函数来保存用户的最后一次连接。即使我可以通过检查同一功能中的最后一个连接来检查其他用户是否仍在线,但是谁将调用该功能来检查最后一个用户是否离开?
我想知道每次任何用户请求可用的聊天列表时我是否必须进行验证,或者我必须使用其他方法解决此问题。
我想我可以在每次用户加入/创建聊天室时在PHP中设置超时功能。该函数将用户列更新为null
,如果两者都为null
,则更新已关闭的值。当用户在聊天室中时,每隔60秒将调用另一个函数来推迟第一个函数。但我不知道是否可能,以及是否可以使用共享主机。
我希望你能帮助我,非常感谢你的关注。
答案 0 :(得分:2)
答案是 - 不要轮询在线状态,而是让服务器使用PubNub Presence Web Hooks监听频道在线状态的变化。请仔细阅读本文,因为它详细介绍了PubNub的Presence Web Hooks的所有方面,然后查看official documentation for PubNub Presence Web Hooks。用于在服务器上实现REST端点以接收Web挂钩的示例代码是Node,但是如果需要,您可以使用该代码在PHP中实现它,但如果您可以将Node用于此目的,那么它可能是更好的选择(并且您仍然可以将PHP用于其他任何事情。)
我知道您的服务器有一个聊天室创建过程,它会在您的数据库中插入新的聊天室记录,因此您不需要知道该频道何时变为活动状态,但 user1 订阅聊天室频道,如果您需要知道何时发生这种情况,PubNub将通过Web挂钩向您的服务器发送频道活动事件。
当 user2 订阅 user1 的聊天室频道时,PubNub会通过网络连接向您的服务器发送加入事件并且您的服务器可以使用该事件使用 user2 的信息更新您的数据库。
同时, user1 和 user2 将订阅聊天室频道并监控状态(而不是使用hereNow
进行投票)并接收加入事件。当用户离开聊天室(取消订阅频道)时,PubNub将通过Web挂钩向您的服务器发送离开事件,并直接发送给仍在订阅的用户。< / p>
一旦最后一个用户离开聊天室,PubNub将向您的服务器发送频道非活动事件,您的服务器可以调用其聊天室关闭根据需要更新数据库的过程。
这是一个相当高级别的设计,还有一些其他细节需要考虑,但这里的消息是不轮询PubNub以获取状态信息。仅使用hereNow
获取频道的当前状态,并通过Web挂钩到您的服务器或通过在线/订阅您的客户端应用程序,从该点收听进一步的状态事件。在实现中,您实际上订阅了在线状态(侦听在线状态事件),然后调用hereNow
。
有关PubNub相关要求的更详细讨论,我建议您与PubNub Support联系,以便与您联系客户成功经理和解决方案架构师。