Laravel8 Workerman 使用

1. 安装 Workerman

composer require workerman/gateway-worker

2. 创建 Workerman 启动文件

php artisan make:command WorkermanCommand
<?php

namespace App\Console\Commands;

use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;
use GatewayWorker\Register;
use Illuminate\Console\Command;
use Workerman\Worker;

class WorkermanCommand extends Command
{
    protected $signature = 'workerman {action} {--d}';

    protected $description = 'Start a Workerman server.';

    public function handle()
    {
        global $argv;
        $action = $this->argument('action');

        // windows 下启动需要分开启动协议
        if ($action === 'single')
        {
            $start = $this->option('start');

            if ($start === 'register')
            {
                $this->startRegister();
            }
            elseif ($start === 'gateway')
            {
                $this->startGateWay();
            }
            elseif ($start === 'worker')
            {
                $this->startBusinessWorker();
            }
            Worker::runAll();
            return;
        }

        // $argv[0] = 'wk';
        $argv[1] = $action;
        $argv[2] = $this->option('d') ? '-d' : '';

        $this->start();
    }

    private function start()
    {
        $this->startGateWay();
        $this->startBusinessWorker();
        $this->startRegister();
        Worker::runAll();
    }

    private function startBusinessWorker()
    {
        $worker                  = new BusinessWorker();
        $worker->name            = 'BusinessWorker';
        $worker->count           = 4;
        $worker->registerAddress = '127.0.0.1:1236';
        $worker->eventHandler    = \App\Services\WorkermanService::class;
    }

    private function startGateWay()
    {
        $gateway = new Gateway("websocket://0.0.0.0:9004");
        $gateway->name                 = 'Gateway';
        $gateway->count                = 4;
        $gateway->lanIp                = '127.0.0.1';
        $gateway->startPort            = 2300;
        $gateway->pingInterval         = 30;
        $gateway->pingNotResponseLimit = 0;
        $gateway->pingData             = '{"type":"@heart@"}';
        $gateway->registerAddress      = '127.0.0.1:1236';
    }

    private function startRegister()
    {
        new Register('text://0.0.0.0:1236');
    }
}

3. 创建事件监听文件

创建文件 App\Services\WorkermanService.php ,也可以替换为其他文件,修改启动文件中的 eventHandler 即可

<?php

namespace App\Services;

class WorkermanService
{
    public static function onWorkerStart($businessWorker)
    {
        
    }

    public static function onConnect($client_id)
    {
        
    }

    public static function onWebSocketConnect($client_id, $data)
    {
        
    }

    public static function onMessage($client_id, $message)
    {
        
    }

    public static function onClose($client_id)
    {
     
    }
}

4. 启动 Workerman 服务端

php artisan workerman start --d

5. windows端 不能同时开启多个协议,必须要分开启动

php artisan workerman single --start=register
php artisan workerman single --start=gateway
php artisan workerman single --start=worker

6. 可以创建一个 bat 文件直接执行

start /b php artisan workerman single --start=register
start /b php artisan workerman single --start=gateway
start /b php artisan workerman single --start=worker
pause  

评论已关闭。