Laravel中Websocket基本使用(Workerman)

2022-09-14 15:13:48 浏览数 (2)

什么是Workerman

Workerman是一款开源高性能异步PHP socket框架。支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。拥有异步Mysql、异步Redis、异步Http、MQTT物联网客户端、异步消息队列等众多高性能组件。

本文介绍workerman实现socket通讯,在此之前请确定你对websocket有所了解

什么是GatewayWorker

GatewayWorker是基于Workerman开发的一套TCP长连接的应用框架, 实现了单发、群发、广播等接口,内置了mysql类库, GatewayWorker分为Gateway进程和Worker进程,天然支持分布式部署,能够支持庞大的连接数(百万甚至千万连接级别的应用)。 可用于开发IM聊天应用、移动通讯、游戏后台、物联网、智能家居后台等等。

安装 gateway-worker
代码语言:javascript复制
composer require workerman/gateway-worker
创建命令启动 workerman服务
代码语言:javascript复制
php artisan make:command WorkermanCommand

创建的命令存放在 appConsoleCommands 在WorkermanCommand.php键入如下代码

代码语言:javascript复制
<?php

namespace AppConsoleCommands;

use GatewayWorkerBusinessWorker;
use GatewayWorkerGateway;
use GatewayWorkerRegister;
use IlluminateConsoleCommand;
use WorkermanWorker;

class WorkermanCommand extends Command
{

    protected $signature = 'workman {action} {--d}';

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

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

        $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();
        //work名称
        $worker->name            = 'BusinessWorker';
        //businessWork进程数
        $worker->count           = 2;
        //服务注册地址
        $worker->registerAddress = '127.0.0.1:1236';
        //设置AppWorkermanEvents类来处理业务
        $worker->eventHandler    = AppWorkermanEvents::class;
    }

    private function startGateWay()
    {  
        //gateway进程
        $gateway = new Gateway("websocket://0.0.0.0:2346");
        //gateway名称 status方便查看
        $gateway->name                 = 'Gateway';
        //gateway进程
        $gateway->count                = 2;
        //本机ip
        $gateway->lanIp                = '127.0.0.1';
        //内部通讯起始端口,如果$gateway->count = 4 起始端口为2300
        //则一般会使用 2300,2301 2个端口作为内部通讯端口
        $gateway->startPort            = 2300;
        //心跳间隔
        $gateway->pingInterval         = 30;
        //客户端连续$pingNotResponseLimit次$pingInterval时间内不发送任何数据则断开链接,并触发onClose。
        //我们这里使用的是服务端主动发送心跳所以设置为0 
        $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');
    }
}

可以使用如下命令

  1. php artisan workman start :启动
  2. php artisan workman stop:停止
  3. php artisan workman restart:重启
  4. php artisan workman reload:平滑重启
  5. php artisan workman status:查看状态
创建事件监听文件来监听处理 workman 的各种事件。

创建 app/Workerman/Events.php

键入如下代码

代码语言:javascript复制
<?php

namespace AppWorkerman;
use GatewayWorkerLibGateway;
class Events
{

    // businessWorker进程启动事件
    public static function onWorkerStart($businessWorker)
    {
    }
    //连接事件
    public static function onConnect($client_id)
    {
        // 向当前client_id发送数据
        Gateway::sendToClient($client_id, "Hello $client_id");
    }
    //进程退出事件
    public static function onWebSocketConnect($client_id, $data)
    {
    }
    //消息事件
    public static function onMessage($client_id, $message)
    {
         // 向所有人发送
         Gateway::sendToAll("$client_id said $message");
    }
    // 连接断开事件
    public static function onClose($client_id)
    {
    }
}
启动workerman

运行命令

代码语言:javascript复制
php artisan workman start --d

如下界面代表启动workerman启动成功

启动成功后,我们可以利用websocket在线测试工具测试连接

Laravel基本使用workman就介绍到这里,后面会利用workman实现简单聊天功能 移步至【配置wss】【实现聊天】

0 人点赞