thinkphp6使用workerman的gateway做会话消息和推送(一对一)

thinkphp6使用workerman的gateway做会话消息和推送(一对一)

1,第一步安装workerman,***poser命令安装就行

2、创建事件控制器,我是多应用项目,所以放到app\api\controller里面了,创建了一个Events.php,使用了jwt验证,传入的参数是 type,from,to,message

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2018 http://thinkphp.*** All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.***>
// +----------------------------------------------------------------------
namespace app\api\controller;

use GatewayWorker\Lib\Gateway;
use library\JwtToken;
use Workerman\Worker;
use think\worker\Application;

/**
 * Worker 命令行服务类
 */
class Events
{
    /**
     * onWorkerStart 事件回调
     * 当businessWorker进程启动时触发。每个进程生命周期内都只会触发一次
     *
     * @a***ess public
     * @param  \Workerman\Worker    $businessWorker
     * @return void
     */
    public static function onWorkerStart(Worker $businessWorker)
    {
        $app = new Application;
        $app->initialize();
    }

    /**
     * onConnect 事件回调
     * 当客户端连接上gateway进程时(TCP三次握手完毕时)触发
     *
     * @a***ess public
     * @param  int       $client_id
     * @return void
     */
    public static function onConnect($client_id)
    {
        Gateway::sendToCurrentClient("Your client_id is $client_id");
    }

    /**
     * onWebSocketConnect 事件回调
     * 当客户端连接上gateway完成websocket握手时触发
     *
     * @param  integer  $client_id 断开连接的客户端client_id
     * @param  mixed    $data
     * @return void
     */
    public static function onWebSocketConnect($client_id, $data)
    {
        var_export($data);
    }

    /**
     * onMessage 事件回调
     * 当客户端发来数据(Gateway进程收到数据)后触发
     *
     * @a***ess public
     * @param  int       $client_id
     * @param  mixed     $data
     * @return void
     */
    public static function onMessage($client_id, $data)
    {
        $data = json_decode($data);
        $data->message = json_encode($data->message);
        try{
            $data->from = (new JwtToken())->verifyJwt($data->from)['id'];
        }catch (\Exception $e){
            returnError('token解析错误');
        }
        if ($data->type == 'init') {
            Gateway::bindUid($client_id, $data->from);
            self::returnMessage($client_id, 200, '初始化成功');
        }
        if($data->type == 'chat')
        {
            Gateway::sendToUid($data->to, $data->message);
            self::returnMessage($client_id, 200, '消息发送成功');
        }

    }


    public static function returnMessage($client_id, $type, $message)
    {
        Gateway::sendToClient($client_id, json_encode([
            'code' => $type,
            'type' => 'back',
            'message' => $message
        ]));
    }

  

    /**
     * onClose 事件回调 当用户断开连接时触发的方法
     *
     * @param  integer $client_id 断开连接的客户端client_id
     * @return void
     */
    public static function onClose($client_id)
    {
        GateWay::sendToAll("client[$client_id] logout\n");
    }

    /**
     * onWorkerStop 事件回调
     * 当businessWorker进程退出时触发。每个进程生命周期内都只会触发一次。
     *
     * @param  \Workerman\Worker    $businessWorker
     * @return void
     */
    public static function onWorkerStop(Worker $businessWorker)
    {
        echo "WorkerStop\n";
    }
}

3、接下来就是配置文件config/gateway_worker.php,需要修改的就是port2348这个,根据workman开放的端口来调整,不固定,还有        'eventHandler' => 'app\api\controller\Events',最后一行改成实际的目录

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2018 http://thinkphp.*** All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.***>
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | Workerman设置 仅对 php think worker:gateway 指令有效
// +----------------------------------------------------------------------
return [
    // 扩展自身需要的配置
    'protocol' => 'websocket', // 协议 支持 tcp udp unix http websocket text
    'host' => '0.0.0.0', // 监听地址
    'port' => 2348, // 监听端口
    'socket' => '', // 完整监听地址
    'context' => [], // socket 上下文选项
    'register_deploy' => true, // 是否需要部署register
    'businessWorker_deploy' => true, // 是否需要部署businessWorker
    'gateway_deploy' => true, // 是否需要部署gateway

    // Register配置
    'registerAddress' => '127.0.0.1:1236',

    // Gateway配置
    'name' => 'thinkphp',
    'count' => 1,
    'lanIp' => '127.0.0.1',
    'startPort' => 2000,
    'daemonize' => false,
    'pingInterval' => 30,
    'pingNotResponseLimit' => 0,
    'pingData' => '{"type":"ping"}',

    // BusinsessWorker配置
    'businessWorker' => [
        'name' => 'BusinessWorker',
        'count' => 1,
        'eventHandler' => 'app\api\controller\Events',
    ],

];

4,启动gateway

成功应该是这个样子的。

消息推送的话,isUidOnline是检测在不在线,send是发送,

use GatewayWorker\Lib\Gateway;

要先引用下这个

转载请说明出处内容投诉
CSS教程网 » thinkphp6使用workerman的gateway做会话消息和推送(一对一)

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买