• thinkphp5集成GatewayWorker


    Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架,而GatewayWorker则是基于Workerman开发的一个长连接框架,支持分布式部署,支持全局广播或者向任意客户端推送数据,作为快速开发TCP长连接应用非常方便;

    说明,本文主要通过手动安装GatewayWorker扩展,因此拷贝vendor下的核心代码即可。暂不提供composer安装说明

    第一步:下载GatewayWorker(Fork地址 https://github.com/walkor/gatewayworker)

    第二步:将GatewayWorker文件夹中的“GatewayWorkervendor”下“Workerman”放入tp5项目extend目录

    第三步:添加入口文件

    在项目根目录 新增启动服务文件server.php,用于在cli模式下运行tp

    关键代码:

      ini_set('display_errors', 'on');

      if(strpos(strtolower(PHP_OS), 'win') === 0){
        exit("start.php not support windows. ");
      }
      // 检查扩展
      if(!extension_loaded('pcntl')){
        exit("Please install pcntl extension. See http://doc3.workerman.net/appendices/install-extension.html ");
      }
      if(!extension_loaded('posix')){
        exit("Please install posix extension. See http://doc3.workerman.net/appendices/install-extension.html ");
      }


      define('APP_PATH', __DIR__ . '/application/');
      //绑定默认模块和控制器
      define('BIND_MODULE', 'push/Run');
      // 加载框架引导文件
      require __DIR__ . '/thinkphp/start.php';

    第四步:编写GatewayWorker运行代码

    Run 控制器:

      路径:/application/push/controller/Run.php

      关键代码:

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

        //控制器无需继承Controller

        /**
        * 构造函数
        * @access public
        */
        public function __construct(){
          //由于是手动添加,因此需要注册命名空间,方便自动加载,具体代码路径以实际情况为准
           hinkLoader::addNamespace([
            'Workerman' => EXTEND_PATH . 'Workerman/workerman',
            'GatewayWorker' =>EXTEND_PATH . 'Workerman/gateway-worker/src',
          ]);

          /初始化各个GatewayWorker

          //1.初始化register
          new Register('text://0.0.0.0:1238');

          //2.初始化 bussinessWorker 进程
          $worker = new BusinessWorker();
          $worker->name = 'YourAppBusinessWorker';
          $worker->count = 4;
          $worker->registerAddress = '127.0.0.1:1238';

          
               //3.设置处理业务的类,此处制定Events的命名空间
            $worker->eventHandler = 'apppushcontrollerEvents';


          //4.初始化 gateway 进程
          $gateway = new Gateway("websocket://0.0.0.0:8282");
          $gateway->name = 'YourAppGateway';
          $gateway->count = 4;
          $gateway->lanIp = '127.0.0.1';
          $gateway->startPort = 2900;
          $gateway->registerAddress = '127.0.0.1:1238';

          //运行所有Worker;
          Worker::runAll();

        }

    第五步:编写Events.php 进行业务处理;

    Events 控制器:

      路径:/application/push/controller/Events.php

      关键代码: 

    1. 可直接使用GatewayWorker代码包中GatewayWorkerApplicationsYourApp的Events.php代码
    2. 也可使用TP的各种函数和类库

    至此,服务端已经编写完毕;

    第六步:运行程序

    使用终端执行命令: php /wwwroot/你的tp5项目/server.php start

    总结:

    集成GatewayWorker扩展,无非就是如何正确加载GatewayWorker相关类库文件以及设定处理业务的 controller,容易出错的地方也就是这个地方:


    1 GatewayWorker的自动加载
    关键代码:

    1.   hinkLoader::addNamespace([
    2.             'Workerman' => EXTEND_PATH . 'Workerman/workerman',
    3.             'GatewayWorker' =>EXTEND_PATH . 'Workerman/gateway-worker/src',
    4.  ]);

    只要确保文件加载正常,后续操作就是将 Register,BusinessWorker和Gateway 初始化,运行即可

    2 $worker->eventHandler,设定处理业务的 controller,tp5使用命名空间,此处同样需要填写完整的命名空间

  • 相关阅读:
    腾讯2022暑期实习服务器被挤爆,23届校招难度升级,该如何去准备?
    【校招VIP】出品:校招java大厂之 java考点5(jvm三大考点) 校招VIP
    【校招VIP|产品】从脑图到原型图
    博客互挂友链
    反爬虫技术和爬虫特点
    有时候你不逼自己一把,根本不知道自己潜力有多大
    阿里技术专家?10年+工作经验?架构能力不错但是….
    解决浏览器跨域问题
    Spring 最常用工具类汇总
    sass语言
  • 原文地址:https://www.cnblogs.com/feixiablog/p/8177055.html
Copyright © 2020-2023  润新知