laravel引入GatewayWorker开发webscoket项目

GatewayWorker是基于workerman的分布式即时通讯框架

可以开发物联网,即时聊天等应用.支持tcp websocket等长链接协议

缺点是没有数据库操作类,控制器,验证类等.都要自己写

这个文章是适合有GatewayWorker使用经验的开发者.

在laravel框架新建一个自定义命令行

<?php

namespace App\Console\Commands;

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

class WorkermanCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'workman {action} {d?}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Start a Workerman server.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        global $argv;

        $action = $this->argument('action');

        $argv[0] = 'wk';
        $argv[1] = $action;
        if($this->argument('d')){
            $argv[2]="-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           = 1;
        $worker->registerAddress = '127.0.0.1:1238';
        $worker->eventHandler    = \App\Workerman\Events::class;
    }

    private function startGateWay()
    {
        $gateway = new Gateway("websocket://0.0.0.0:8585");
        // gateway名称,status方便查看
        $gateway->name = 'YourAppGateway';
// gateway进程数,一般设置2个就足够
        $gateway->count = 2;
// 本机ip,分布式部署时使用内网ip
        $gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,假如$gateway->count=2,起始端口为2900
// 则一般会使用2900 2901 2个端口作为内部通讯端口
        $gateway->startPort = 2900;
// 服务注册地址
        $gateway->registerAddress = '127.0.0.1:1238';

// 心跳间隔,客户端多久不发心跳就断开
        $gateway->pingInterval = 60;
//是否允许客户端不发心跳
        $gateway->pingNotResponseLimit = 1;

// 心跳数据
        $gateway->pingData = '{"type":"ping"}';
    }

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

在App\Workerman目录新建;
Events.php

<?php

namespace App\Workerman;

use App\Exceptions\BusinessExceptions;

use \GatewayWorker\Lib\Gateway;


class Events
{

    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)
    {
           //接收$message
         // 这里可以做路由分发实例化对应的类和方法
         //实例化具体的控制器和方法,返回json类型的数据
      Gateway::sendToClient($client_id, json_encode($res,JSON_UNESCAPED_UNICODE));
    }

    public static function onClose($client_id)
    {

    }
}

例如
请求的内容

{
"type":"v1/my/get"
}

可以转化成调用 Logic目录下的
v1/MyLogic.php的function get()

namespace App\Http\Logic\v1;
class Mylogic{
    function get(){
        return ['code'=>1,"message"=>"mesages","data"=>[]]
    }
}

其他的方面和laravel用法差不多.不能使用laravel框架的session,可以使用GatewayWorker的session

启动命令
启动(开发模式)
php artisan workman start
启动
php artisan workman start d
停止
php artisan workman stop
重启
php artisan workman restart

同理也可以引入到thinkphp和webman

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!