2020/04/19 PHP/Python/Java No Comments tp6 GatewayWorker IM ##### thinkphp6使用gatewayworker开发IM,thinkphp6使用Workerman gateway_worker实现IM. ####说明: `1、本文调试基于centos、lnmp开发环境。` `2、thinkphp6多应用模式` `3、配置文件、事件回调文件更改后需要重启worker服务才会生效` ## 一、基础:了解GatewayWorker > GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等 > GatewayWorker使用经典的Gateway和Worker进程模型。Gateway进程负责维持客户端连接,并转发客户端的数据给BusinessWorker进程处理,BusinessWorker进程负责处理实际的业务逻辑(默认调用Events.php处理业务),并将结果推送给对应的客户端。Gateway服务和BusinessWorker服务可以分开部署在不同的服务器上,实现分布式集群。 > GatewayWorker提供非常方便的API,可以全局广播数据、可以向某个群体广播数据、也可以向某个特定客户端推送数据。配合Workerman的定时器,也可以定时推送数据。 ## 二、通过composer安装相关扩展库 首先是安装workerman `composer require topthink/think-worker` 其次是安装GatewayWorker `composer require workerman/gateway-worker` ## 三、配置 **1、配置调整,配置文件位于config目录下gateway_worker.php** ```php // 扩展自身需要的配置 'protocol' => 'websocket', // 协议 支持 tcp udp unix http websocket text 'host' => '0.0.0.0', // 监听地址 'port' => 23489, // 监听端口 'socket' => '', // 完整监听地址 'context' => [], // socket 上下文选项 'register_deploy' => true, // 是否需要部署register 'businessWorker_deploy' => true, // 是否需要部署businessWorker 'gateway_deploy' => true, // 是否需要部署gateway // Register配置 'registerAddress' => '127.0.0.1:12360', // Gateway配置 'name' => 'FITYCN', 'count' => 4, 'lanIp' => '127.0.0.1', 'startPort' => 20000, 'daemonize' => false, 'pingInterval' => 30,//心跳检测,默认30秒,监测不到断开链接 'pingNotResponseLimit' => 1,//0服务端主动发送心跳(不推荐,默认) 1客户端定时发送心跳(推荐,设为1后客户端需做主动定时向服务端发包处理) 'pingData' => '{"type":"ping"}',//服务端定时向客户端发送的数据 // BusinsessWorker配置 'businessWorker' => [ 'name' => 'BusinessWorker', 'count' => 1, // 'eventHandler' => '\think\worker\Events', 'eventHandler' => 'app\http\Events', ], ``` **2、Events.php事件文件位置调整** 如上配置本demo将Events.php事件回调文件位置调整到app下http目录下 `\app\http\Events.php` 命名空间调整: `namespace app\http;` ## 四、事件回调相关调整 Events.php事件回调文件中各方法可根据自己的实际开发需求进行调整,以下为本demo调整的onMessage示例: ```php /** * onMessage 事件回调 * 当客户端发来数据(Gateway进程收到数据)后触发 * * @access public * @param int $client_id * @param mixed $data * @return void */ public static function onMessage($client_id, $data) { // 获取发送过来的消息内容 解析 $message_data = json_decode($data,true); file_put_contents('2020.txt', date('Y-m-d H:i:s').$data.PHP_EOL,FILE_APPEND); switch($message_data['type']) { case "bind": $fromId = $message_data['fromId']; // 设置GatewayWorker服务的Register服务ip和端口,请根据实际情况改成实际值(ip不能是0.0.0.0) Gateway::$registerAddress = '127.0.0.1:12360'; // client_id与uid绑定 Gateway::bindUid($client_id, $fromId); //Gateway::sendToCurrentClient("绑定成功"); /** *调用存储用户的方法等等 **/ return; case "text": $toId = $message_data['toId']; //Gateway::sendToUid($toId, json_encode($data)); //Gateway::sendToClient($toId, json_encode($data)); Gateway::sendToUid($toId, $data); default : return ; } //Gateway::sendToAll($data); } ``` ## 五、运行服务 启动 php think worker:gateway 守护进程模式 php think worker:gateway -d 其他: php think worker:gateway -d start php think worker:gateway -d stop php think worker:gateway -d restart ``` # /usr/local/php7.2/bin/php think worker:gateway -d start Starting GatewayWorker server... Workerman[think] start in DAEMON mode --------------------------------------------- WORKERMAN --------------------------------------------- Workerman version:3.5.31 PHP version:7.2.6 ---------------------------------------------- WORKERS ---------------------------------------------- proto user worker listen processes status tcp root Register text://127.0.0.1:12360 1 [OK] tcp root BusinessWorker none 1 [OK] tcp root FITYCN websocket://0.0.0.0:23489 4 [OK] ----------------------------------------------------------------------------------------------------- Input "php think stop" to stop. Start success. ``` ## 六、IM客户端开发及调试 请参考附件:[附件为做好的简单Demo](https://www.fity.cn/usr/uploads/2021/gateway-im-demo.zip "附件为做好的简单Demo") **说明:**demo文件请放在thinkphp6框架app目录下。运行该demo需要您的tp6框架支持多模块及模板。请安装tp6多应用及模板支持类库: `composer require topthink/think-multi-app #多应用` `composer require topthink/think-view #模板引擎` Demo效果如图(**服务端主动发送心跳模式, 安装后的默认模式**): 1-初始化连接及绑定成功 [![1-初始化连接及绑定成功](https://www.fity.cn/usr/uploads/2021/1-初始化连接及绑定成功.png "1-初始化连接及绑定成功")](https://www.fity.cn/usr/uploads/2021/1-初始化连接及绑定成功.png "1-初始化连接及绑定成功") 2-测试用户2发送消息给用户3 [![2-测试用户2发送消息给用户3](https://www.fity.cn/usr/uploads/2021/2-测试用户2发送消息给用户3.png "2-测试用户2发送消息给用户3")](https://www.fity.cn/usr/uploads/2021/2-测试用户2发送消息给用户3.png "2-测试用户2发送消息给用户3") 3-用户3收到消息 [![3-用户3收到消息](https://www.fity.cn/usr/uploads/2021/3-用户3收到消息.png "3-用户3收到消息")](https://www.fity.cn/usr/uploads/2021/3-用户3收到消息.png "3-用户3收到消息") **客户端定时发送心跳模式(本demo使用的模式):** 在ws.onopen初始化连接时配置定时发送心跳包字符串,如: `setInterval(sendHeartBeat, 25000 );//25秒发送一次` [![1-初始化连接及绑定成功-客户端定时发送心跳模式](https://www.fity.cn/usr/uploads/2021/1-初始化连接及绑定成功-客户端定时发送心跳模式.png "1-初始化连接及绑定成功-客户端定时发送心跳模式")](https://www.fity.cn/usr/uploads/2021/1-初始化连接及绑定成功-客户端定时发送心跳模式.png "1-初始化连接及绑定成功-客户端定时发送心跳模式") 备注:heart beat为自定义字符串(和上文中图片提到的{"type": "ping"}等同,只是为了区分是客户端定时向服务端发送心跳字符串) ## 写在最后: **1、**考虑到文章的时效及可用性,如转发请加上[本文链接](https://www.fity.cn/post/679.html "本文链接")(https://www.fity.cn/post/679.html ),**本文会根据实际问题进行不定期更新完善**。 **2、**推荐参考《GatewayWorker手册》:http://doc2.workerman.net/642185 本文最后更新于 2021-03-09 17:52:08 并被添加「IM tp6 thinkphp6 workerman gatewayworker 消息推送」标签,已有 6658 位童鞋阅读过。 本文作者:未来往事 本文链接:https://felixway.cn/post/679.html 本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处 相关文章 IM语音消息amr文件web网页播放
此处评论已关闭