天天看點

如何不改動 GatewayWorker 依賴包下自定義協定

作者:北橋蘇

前言:

GatewayWorker 是 Workerman 的一個架構,對應用層開發者更友好。GatewayWorker 多了一個網關,也就是 Gateway,負責與用戶端連接配接,消息轉發等。而自定義的協定,也就是 gateway 面向用戶端提供服務的協定,下面就簡單收一下 GatewayWorker 啟動後連接配接的過程吧。

GatewayWorker 流程:

1. 運作 php think worker:gateway start。

2. 啟動 Register 程序并開始端口監聽。

3. 啟動 BusinessWorker 程序,開始異步連接配接 Register。

4. 啟動 Gateway 程序,開啟内部協定 (GatewayProtocol) 并監聽,同時異步連接配接 Register。

5. Gateway 程序将開啟的 GatewayProtocol 服務位址發給 Register。

6. Register 接收 Gateway 内部通訊位址廣播給所有 BusinessWorker 程序。

7. BusinessWorker 異步連結 Gateway,同時 Gateway 也監聽來自用戶端的連結。

8. 當用戶端連接配接 Gateway 發來消息時,則他從連接配接的 BusinessWorker 中抽取一個轉發。

9. BusinessWorker 則将連接配接事件交給 Event 業務處理。

10. Event 處理後又發給 Gateway,Gateway 再發給用戶端。

ThinkPHP 內建 GatewayWorker:

現在新版的 TP 架構已經很好地內建了 GatewayWorker,不再像以前要改動入口檔案。composer require topthink/think-worker 就可以安裝,裡面分别是 think-worker,gateway-worker 和 workerman 三個包。而為了不破壞 vendor 包,自定義的協定最好寫在 TP 架構的應用層。

開始操作:

1. app 目錄下建立一個 library (目錄自行控制),再見一下 Game.php (舉個例子,協定名看自己)。

2. Game.php 需要實作 Workerman 的 ProtocolInterface,且要完成 input,decode,encode 三個方法,之前有介紹,這裡就略過。

如何不改動 GatewayWorker 依賴包下自定義協定

3. 打開 config 的 gateway_worker.php,以下先不做處理的寫好 game 協定。

如何不改動 GatewayWorker 依賴包下自定義協定

4. 直接 php think worker:gateway start 運作,則直接報錯。

如何不改動 GatewayWorker 依賴包下自定義協定

5. 因為 gateway 外部協定需要 Workerman\Protocols 的指令空間,是以隻需要給自定義的協定類起一個别名。

class_alias('app\library\Game', 'Protocols\Game');           
如何不改動 GatewayWorker 依賴包下自定義協定

6. 運作一下并做了測試,這樣就完成了。

如何不改動 GatewayWorker 依賴包下自定義協定
如何不改動 GatewayWorker 依賴包下自定義協定

繼續閱讀