人称外号大脸猫

laravel使用workerman GatewayWorker开启websocket服务

安装workerman

composer require workerman/gateway-worker
composer require workerman/gatewayclient

创建启动文件脚本

php artisan make:command GatewayWorkerServer

文件路径 app/Console/Commands/GatewayWorkerServer.php

<?php
namespace App\Console\Commands;

use App\Http\Controllers\WebsocketController;
use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;
use GatewayWorker\Register;
use Illuminate\Console\Command;
use Workerman\Worker;

class GatewayWorkerServer extends Command
{
    protected $signature = 'gateway-worker:server {action} {--daemon}';

    protected $description = 'start a workerman server';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        global $argv;
        if (!in_array($action = $this->argument('action'), ['start', 'stop','reload', 'status','restart'])) {
            $this->error('Error Arguments');
            exit;
        }
        $argv[0] = 'gateway-worker:server';
        $argv[1] = $action;
        $argv[2] = $this->option('daemon') ? '-d' : '';//该参数是以daemon(守护进程)方式启动
        $this->start();
    }

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

    private function startBusinessWorker()
    {
        $worker                  = new BusinessWorker();
        $worker->name            = 'cx-im-worker';
        $worker->count           = 4;
        $worker->registerAddress = '127.0.0.1:2370';  // 该端口可以自定义
        $worker->eventHandler    = WebsocketController::class;  // 该类可以自定义
    }

    private function startGateWay()
    {
        $gateway                       = new Gateway("websocket://0.0.0.0:2375");  // 该端口可以自定义
        $gateway->name                 = 'gateway';
        $gateway->count                = 2;
        $gateway->lanIp                = env('LAN_IP','127.0.0.1');  // 该IP为内网ip或者公网ip
        $gateway->startPort            = 2380;                       // 该端口为起始端口 如开启多个gateway 则依次递增
        $gateway->pingInterval         = 30;
        $gateway->pingNotResponseLimit = 0;
        $gateway->pingData             = '{"type":"ping"}';
        $gateway->registerAddress      = '127.0.0.1:2370';    // 对应gateway的注册地址
    }

    private function startRegister()
    {
        new Register('text://0.0.0.0:2370');            // 对应gateway的注册地址
    }
}

启动服务命令

php artisan gateway-worker:server start  开启
php artisan gateway-worker:server stop   暂停
php artisan gateway-worker:server reload 重载
php artisan gateway-worker:server status  状态
php artisan gateway-worker:server restart 重启


守护进程模式 --daemon
php artisan gateway-worker:server start --daemon
php artisan gateway-worker:server restart --daemon 重启执行这个即可
<?php
namespace App\Http\Controllers;

use Exception;
use GatewayWorker\Lib\Gateway;
use Illuminate\Support\Facades\Log;
use Workerman\Worker;

class WebsocketController
{
    /**
     * @param Worker $businessWorker
     */
    public static function onWorkerStart(Worker $businessWorker): void
    {
        echo "BusinessWorker Start\n";
    }

    /**
     * @param $client_id
     */
    public static function onConnect($client_id): void
    {
        echo "onConnect {$client_id}\n";
    }

    /**
     * @param $client_id
     * @param $data
     * @throws Exception
     */
    public static function onWebSocketConnect($client_id, $data): void
    {
        //var_export($data);
        // 握手成功后设置连接的onMessage回调
    }


    /**
     * @param $client_id
     * @param $data
     * @return void
     * @throws Exception
     */
    public static function onMessage($client_id, $data): void
    {
        // 接收到消息处理
        //var_export($data);
    }

    /**
     * @param $client_id
     * @throws Exception
     */
    public static function onClose($client_id): void
    {
        // 从客户端的连接池删除
    }

    /**
     * onWorkerStop 事件回调
     * 当businessWorker进程退出时触发。每个进程生命周期内都只会触发一次。
     * @param Worker $businessWorker
     * @return void
     */
    public static function onWorkerStop(Worker $businessWorker): void
    {
        echo "WorkerStop\n";
    }
}
copyright ©2025 ahimu.com all rights reserved 皖ICP备19021547号-1