TP6中GatewayWorker的用法

来源:blog.csdn.net 更新时间:2023-05-25 21:55

一、参考网站

tp开发手册:https://www.kancloud.cn/manual/thinkphp6_0/1147857

workman与tp框架结合参考:http://doc2.workerman.net/work-with-other-frameworks.html

开发手册只介绍了Workman的使用方法,没有介绍GatewayWorker的使用方法,通过

composer require topthink/think-worker
 

安装了workman之后可以看到config目录下多出了gateway_worker.php、work.php、worker_server.php三个配置文件,

其中gateway_worker.php就是GatewayWorker的配置文件,这里主要是讲在TP6框架下怎么来使用他,其他两个文档有介绍。

二、使用步骤

1、自定义你的事件类文件

在你的应用app目录下新建一个http目录,目录下新建一个Events.php文件

引用http://doc2.workerman.net/getting-started.html的入门指引告诉你为什么这样做

业务开发的话,你真的只需要关注Events.php这一个文件就好了

2、初始化你的Events.php文件的内容

按下图方式顺序找到位于框架根目录->vendor->topthink->think-worker->src目录下的Events.php

打开文件ctrl+a,然后ctrl+c,直接全选复制,最后拷贝到你自定义的Events.php文件内,然后修改下面截图两处地方

保存之后你的自定义事件类文件内容就是这样的

 
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// namespace think\worker; // 原文件的命名空间
namespace app\http; // 你的类文件的命名空间
 
use GatewayWorker\Lib\Gateway;
use Workerman\Worker;
use think\worker\Application; // 特别注意:下方用到的Application属于think\work命名空间下的类,由于命名空间的更换,需要这样引入才能使用,否则会报错找不到这个类。
 
/**
 * Worker 命令行服务类
 */
class Events
{
    /**
     * onWorkerStart 事件回调
     * 当businessWorker进程启动时触发。每个进程生命周期内都只会触发一次
     *
     * @access public
     * @param  \Workerman\Worker    $businessWorker
     * @return void
     */
    public static function onWorkerStart(Worker $businessWorker)
    {
        $app = new Application;
        $app->initialize();
    }
 
    /**
     * onConnect 事件回调
     * 当客户端连接上gateway进程时(TCP三次握手完毕时)触发
     *
     * @access 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进程收到数据)后触发
     *
     * @access public
     * @param  int       $client_id
     * @param  mixed     $data
     * @return void
     */
    public static function onMessage($client_id, $data)
    {
        Gateway::sendToAll($data);
    }
 
    /**
     * 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文件如下

此处只需将“\think\worker\Events”修改为“app\http\Events”即可完成最后步骤,至此你就已经把GatewayWorker和TP6完美整合起来了,接下来就可以愉快的使用php think worker:gateway来启动我们的GatewayWorker了,具体的onWorkerStart、onConnect、onWebSocketConnect、onMessage、onClose、onWorkerStop事件你都可以在你自定义的Events.php业务类里随意操作了。

4、其他使用方式

以上是采用客户端与GatewayWorker直接双向通讯的方式完成业务通讯,当然你也可以采用官方推荐的GatewayClient的方式,具体使用方法就参考官网示例就行了:http://doc2.workerman.net/work-with-other-frameworks.html

第一次发文,我也只是一个TP6初学者,如果有写得不对的地方,还请各位大佬指正,如果对您有用,请点个赞吧。

5、个人小程序展示

这个我自己做的一个个人小程序,有兴趣的扫来看一看哇。