GatewayWorker流程

GatewayWorker流程

手裏的項目遇到個需求,就瞭解了一下GatewayWorker。本來打算用這個了,但是最後還是選擇了workerman。簡單說一下GatewayWorker流程吧
因爲項目需求用的php做設備通信。設備客戶端使用tcp進行長連接。還要和小程序的應用層進行http連接。所以最初選擇GatewayWorker。因爲GatewayWorker用於快速開發TCP長連接應用,可以方便的實現客戶端與客戶端的通訊。Gateway與Worker之間是基於socket長連接通訊,也就是說Gateway、Worker可以部署在不同的服務器上,非常容易實現分佈式部署,擴容服務器
1.原理
Register、Gateway、BusinessWorker進程啓動
register負責緩存設置
Gateway負責和客戶端的鏈接
BusinessWorker負責業務處理
三個服務啓動後,Gateway會把客戶端的連接信息保存到register內存中。BusinessWorker是接受Register發過來的Gateway連接信息,BusinessWorker接收到信息後。就會嘗試和gateway進行連接。至此Gateway與BusinessWorker通過Register已經建立起長連接
客戶端的事件及數據全部由Gateway轉發給BusinessWorker處理

所有的業務操作在events.php完成即可。其他文件不用修改。

當客戶端連接時觸發
 public static function onConnect($client_id)
{
    // 向當前client_id發送數據 
    Gateway::sendToClient($client_id, "Hello $client_id\r\n");
    // 向所有人發送
    Gateway::sendToAll("$client_id login\r\n");
}

可以看到。這裏操作的都是gateway類,其實gateway類裏面調用的還是businessWorker。所以這裏不要混淆

當客戶端發來消息時觸發
public static function onMessage($client_id, $message)
   {
        // 向所有人發送 
        Gateway::sendToAll("$client_id said $message\r\n");
   }
當用戶斷開連接時觸發
public static function onClose($client_id)
   {
       echo '斷開';
       // 向所有人發送 
       GateWay::sendToAll("$client_id logout\r\n");
   }

如果想開啓第三方擴展,如redis。切記不要在連接時初始化,因爲workerman的數據是存放在共享內存中。當啓動進程時就會初始化,如果在客戶端連接時初始化會覆蓋操作。可以在onworkerstart進程啓動時初始化redis

/**
 * 當進程開啓時開啓redis數據庫
 */
public static function onWorkerStart($businessWorker)
{
    global $redis ;
    $redis = new Redis();
}

注意:客戶端只能連接Gateway端口,不要連接Register端口。客戶端和服務端的協議要保持一致。長連接需要開啓心跳

2、啓動與停止

啓動
以debug(調試)方式啓動

php start.php start

以daemon(守護進程)方式啓動

php start.php start -d

停止

php start.php stop

重啓

php start.php restart

平滑重啓

php start.php reload

查看狀態

php start.php status

文件目錄
在這裏插入圖片描述
gatewayworker下載地址:鏈接:https://pan.baidu.com/s/1x4onXfhy62Ttmxx1bpfxwA 密碼:tvc3

發佈了33 篇原創文章 · 獲贊 66 · 訪問量 7590
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章