在 PHP 上使用 Ratchet 和 WebSockets 进行私人和群聊

Posted

技术标签:

【中文标题】在 PHP 上使用 Ratchet 和 WebSockets 进行私人和群聊【英文标题】:Private and group chats using Ratchet and WebSockets on PHP 【发布时间】:2016-12-12 21:08:38 【问题描述】:

我的目标是制作一个带有私人和群聊选项的聊天应用程序。我更习惯于在 php 中使用 Ratchet 和 WebSockets,而不是使用 node.js,因为人们告诉我那将是最好的。

虽然我只在全球聊天的上下文中看到了 WebSockets 的示例。

我的方法是使用 WebSocket id 并将其存储在数据库中,因为当人们请求与某个人或某个组的人聊天时,我会给服务器这些 id,它只会发送给那些人

那会是正确的方法吗?有没有更好的方法来解决这个问题?

【问题讨论】:

在创建基于聊天室和私人聊天的应用程序时,有许多协议可以激发灵感。最受欢迎且被 Slack 等公司盗用的是IRC protocol。您不必阅读我链接的 RFC,您可以搜索更小的、tl;dr 版本的协议。它将教您如何处理消息、如何将它们显示给适当的一方以及如何设计您所描述的应用程序。 【参考方案1】:

如果你使用 Ratchet,这是一个很好的 websocket 的 PHP 库,你还阅读了关于 the WAMP server 的部分,它是 the WAMP protocol (v1) 的实现,关于在你的聊天室中创建多个“主题”案例。

建议在 WAMP 协议之上构建多频道聊天服务器。

在您的情况下,您还希望保护您的主题。您必须以自己的方式实现此安全性,并且可能按主题限制 2 个用户...

第一种方法可能是使用令牌。当用户想要与某人私下交谈时,他会创建一个带有秘密令牌的私人频道,然后将这个秘密令牌传达给他想要交谈的用户。所以使用 WAMP 协议,就像使用足够的秘密令牌创建一个名为 /chat/5sd4f5qsg8rr5sg8rg 的主题。

另一种更结构化的方法是在数据库中存储一个元组 userA / userB / 主题名称,然后创建主题并只允许这两个用户加入它。 当有人加入时,通知另一个人(通过相同的 websocket 连接)他的朋友想要交谈(或自动打开聊天窗口......)。

【讨论】:

【参考方案2】:

当你创建一个套接字时,你就创建了一个资源句柄;您不能将资源句柄存储在数据库中。

您需要为每个用户创建一对一的客户端-服务器套接字连接,然后通过这些连接分发聊天。如果用户断开连接,则套接字连接丢失并且您无法发送消息,因此您必须存储在数据库中,然后在他们连接时刷新。

【讨论】:

以上是关于在 PHP 上使用 Ratchet 和 WebSockets 进行私人和群聊的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 上使用 Ratchet 和 WebSockets 进行私人和群聊

PHP Ratchet 和 WebRTC

如何在 MAMP 或 XAMPP 上安装 Ratchet WebSockets for PHP?

Javascript 无法连接到 PHP Ratchet WebSocket 服务器

在 Debian 上运行的 Ratchet PHP Websocket

使用 Ratchet for PHP 通过 WebSocket 流式传输二进制数据