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