php即时通讯,基于GatewayWorker聊天

在上一篇文章中,我们简单了如何创建 webSocket 链接,
以及如何在客户端链接 webSocket 服务,发送消息等操作,
在这篇文章中,我们将简单介绍一下,
如何实现及时通讯,用户一对一聊天。

在说之前先介绍一个开源项目:SimplerWorker
这次的项目就是在这个项目的基础上进行开发的,
这个项目的安装及使用,大家可以根据文档进行操作,
(建议:先熟悉上一篇的相关流程及的操作)
当前项目已集成好 workerman 的相关服务,
我们只需要在 worker/index 控制器中添加相关业务逻辑操作即可。

一、启动 Workerman 服务

php worker.php start -d

冯奎博客

二、打开测试页面查看链接状态

/Worker/Index/index 页面

冯奎博客 可以看到当前状态连接成功,心跳也定时给客户端返回消息,确认连接状态。

三、设计聊天数据表

DROP TABLE IF EXISTS `message`;
CREATE TABLE `message`  (
  `id` int(255) NOT NULL AUTO_INCREMENT COMMENT '表id',
  `to_id` int(20) NULL DEFAULT 0 COMMENT '接收方id',
  `from_id` int(20) NULL DEFAULT 0 COMMENT '发送者id',
  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '消息内容',
  `type` tinyint(2) NULL DEFAULT 1 COMMENT '类型:1=文字,2=emoji,3=图片,4=音频',
  `status` tinyint(2) NULL DEFAULT 0 COMMENT '状态:0=未读,1=已读',
  `client_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'client_id',
  `createtime` int(11) NOT NULL DEFAULT 0 COMMENT '添加时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '消息列表' ROW_FORMAT = Compact;

这里仅上了一对一聊天表,用户群聊表可根据自己的需求修改

四、推送相关消息(重要)

建议去看一下这里 (Lib\Gateway类提供的接口
看完相关接口的介绍,根据自己需求选择适当的接口进行消息推送。

1. sendToAll
Gateway::sendToAll(string $send_data [, array $client_id_array = null [, array $exclude_client_id = null [, bool $raw = false]]]);

向所有客户端或者client_id_array指定的客户端发送$send_data数据。如果指定的$client_id_array中的client_id不存在则自动丢弃

2. sendToClient
Gateway::sendToClient(string $client_id, string $send_data);

向客户端client_id发送$send_data数据。如果client_id对应的客户端不存在或者不在线则自动丢弃发送数据

3. sendToUid
Gateway::sendToUid(mixed $uid, string $message);

向uid绑定的所有在线client_id发送数据。

注意:默认uid与client_id是一对多的关系,如果当前uid下绑定了多个client_id,则多个client_id对应的客户端都会收到消息,这类似于PC QQ和手机QQ同时在线接收消息。

4. sendToGroup
Gateway::sendToGroup(mixed $group, string $message [, array $exclude_client_id = null [, bool $raw = false]]);

向某个分组的所有在线client_id发送数据。

说明:
在推送消息的同时,我们要将用户发送的消息保存到数据库,
语音及图片的聊天,我们只需先调用文件的上传,
然后将返回的文件保存即可,注意选择消息的类型。

冯奎博客
请先登录后发表评论
  • latest comments
  • 总共0条评论