# Socket - GatewayWorker

TIP

特別感謝 此為 rainlay 大分享技術筆記, 在此感謝! @https://github.com/rainlay

# 名詞說明

# workerman/gatewayworker 是一套 Socket 框架

官方文件 (opens new window)

  • gateway
  • register
  • worker
當初為了維持 HA 以及 Scalable, 台灣的 socket Server 架設的方式為 
Master-worker 分散式部屬方式,
Master 負責的部分為 gateway, register,
Worker 的部分則為 Business Worker,因此如果發生系統瓶頸時, 
看是在 gateway的部分或者 worker 的部分 loading 較高,
即可新增 Master 或 Worker 的機器即可
1
2
3
4
5
6

因TH目前只有作答監控且使用者人數較低的原因,因此 Server 並沒有以分散式架構進行部屬, 全部服務皆為同一台。

# Socket Server 操作

這邊只介紹常用的幾個指令

# 啟動

至專案目錄執行

sudo php start.php start -d
1

start 就是啟動socket server,並且會顯示 log、以及 error 等資訊, 適合 debug 使用,-d 則表示以 daemon 方式啟動,因此正式環境下啟動請務必加上 -d

# 重載 Reload

sudo php start.php reload
1

reload 會讓 socket 重新讀取程式碼,但不會中斷服務,因此非常適合新功能上線時使用。

# 重啟

sudo php start.php restart
1

# 查看 socket 狀態

狀態的說明可參考官方文件 (opens new window)

sudo php start.php status
1

# 專案架構

# COMPANYConfig.php

專案目錄有以下設定檔案:

  • ConfigDev.php
  • ConfigLocal.php
  • ConfigTesting.php
  • ConfigMaster.php
  • ConfigWorkerOne.php

基本上這些 Config 會在部屬時因為不同的環境而去轉換成 COMPANYConfig.php ex: websocket-master 的 COMPANYConfig 等於 ConfigMaster.php websocket-worker1 的 COMPANYConfig 等於 ConfigWorkerOne.php

裡面的 Config 參數決定了 Socket Server 如何啟動

# 參數說明

# $machineType

以什麼服務啟動 ex: Register/Gateway, BusinessWorker,像 master 的機器就是 Register/Gateway, worker 機器則是 BusinessWorker,測試機或本地環境則是 All。

# $lanIp

該 server 的內網 IP,非分散式部屬通常就是 127.0.0.1

# $registerAddress

register 的 server ip, 例如 worker的config 必須指到 master 機器的 ip, 否則會設定錯誤。

# $stageMode

stageMode 主要是用在給程式判斷是否要開啟 wss 所使用(start_gateway.php)。

# 泰國 Socket DB 連線資訊

台灣的 Socket 目前並不直接連線 Database, 故跳過。

# dotenv

鑑於保護敏感資訊,有別於較的專案,泰國 Socket 這邊導入了 env file(phpdotenv) (opens new window) 機制,將敏感資訊如 DB, Firebase token等類型資訊以 .env file 方式儲存,所以此 env file 不會存在 git 裡面,在開發以及部署正式環境時記得手動設定檔案。

檔案路徑:

/home/ubuntu/PROJECT/Applications/PROJECTApp/project_app.env
1

範例檔案路徑:

/home/ubuntu/PROJECT/Applications/PROJECTApp/project_app_example.env
1

# 程式部屬

部屬可以用兩個方式

# 一般方式

ssh 至 socket 主機,至專案目錄執行

# 更新程式碼
git pull origin master
# 讓 workerman reload 程式碼
sudo php start.php reload
1
2
3
4

手動部屬須注意的是 Master, Worker 等不同主機都需上去手動執行,如果以後有相關 Config 調整,必須記得手動處理。

dep deploy production
1

即可自動部屬程式碼,不管是 Master, Worker 的 config, Workerman 的 reload,等繁雜設定皆可自動完成。