thinkphp5集成GatewayWorker

Workerman是一款純PHP開發的開源高性能的PHP socket 服務器框架,而GatewayWorker則是基於Workerman開發的一個長鏈接框架,支持分佈式部署,支持全局廣播或者向任意客戶端推送數據,做爲快速開發TCP長鏈接應用很是方便;php

說明,本文主要經過手動安裝GatewayWorker擴展,所以拷貝vendor下的核心代碼便可。暫不提供composer安裝說明html

 

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

第二步:將GatewayWorker文件夾中的「GatewayWorker\vendor\」下「Workerman」放入tp5項目extend目錄

第三步:添加入口文件

在項目根目錄 新增啓動服務文件server.php,用於在cli模式下運行tpgit

關鍵代碼:github

  ini_set('display_errors', 'on');web

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


  define('APP_PATH', __DIR__ . '/application/');
  //綁定默認模塊和控制器
  define('BIND_MODULE', 'push/Run');
  // 加載框架引導文件
  require __DIR__ . '/thinkphp/start.php';windows

第四步:編寫GatewayWorker運行代碼

Run 控制器:服務器

  路徑:/application/push/controller/Run.phpwebsocket

  關鍵代碼:app

    use Workerman\Worker;
    use GatewayWorker\Register;
    use GatewayWorker\BusinessWorker;
    use GatewayWorker\Gateway;

    //控制器無需繼承Controller

    /**
    * 構造函數
    * @access public
    */
    public function __construct(){
      //因爲是手動添加,所以須要註冊命名空間,方便自動加載,具體代碼路徑以實際狀況爲準
      \think\Loader::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 = '\app\push\controller\Events';


      //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代碼包中GatewayWorker\Applications\YourApp的Events.php代碼
  2. 也可以使用TP的各類函數和類庫

至此,服務端已經編寫完畢;

第六步:運行程序

使用終端執行命令: php /wwwroot/你的tp5項目/server.php start

 

 

總結:

集成GatewayWorker擴展,無非就是如何正確加載GatewayWorker相關類庫文件以及設定處理業務的 controller,容易出錯的地方也就是這個地方:


1 GatewayWorker的自動加載
關鍵代碼:

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

只要確保文件加載正常,後續操做就是將 Register,BusinessWorker和Gateway 初始化,運行便可

2 $worker->eventHandler,設定處理業務的 controller,tp5使用命名空間,此處一樣須要填寫完整的命名空間

相關文章
相關標籤/搜索