標籤:div 進程 htm app ase 源碼 com 0.12 伺服器
├── Applications // 這裡是所有開發人員應用項目│ └── YourApp // 其中一個項目目錄,目錄名可以自訂│ ├── Events.php // 開發人員只需要關注這個檔案│ ├── start_gateway.php // gateway進程啟動指令碼,包括連接埠號碼等設定│ ├── start_businessworker.php // businessWorker進程啟動指令碼│ └── start_register.php // 註冊服務啟動指令碼│├── start.php // 全域啟動指令碼,此指令碼會依次載入Applications/項目/start_*.php啟動指令碼│└── vendor // GatewayWorker架構和Workerman架構源碼目錄,此目錄開發人員不用關心
特別注意:
[1]用戶端的事件及資料全部由Gateway轉寄給BusinessWorker處理,BusinessWorker預設調用Events.php中的onConnect onMessage onClose處理商務邏輯。
<script language="javascript" type="text/javascript"> var $URL = "__APP__/Home/GatewayWorker/bindUid"; // 與GatewayWorker建立websocket串連,網域名稱和連接埠改為你實際的網域名稱連接埠 ws = new WebSocket("ws://127.0.0.1:8384"); // 服務端主動推送訊息時會觸發這裡的onmessage ws.onmessage = function(e){ // json資料轉換成js對象 var data = eval("("+e.data+")"); var type = data.type || ‘‘; switch(type){ // Events.php中返回的init類型的訊息,將client_id發給後台進行uid綁定 case ‘init‘: // 利用jquery發起ajax請求,將client_id發給後端進行uid綁定 $.post($URL, {client_id: data.clientId}, function(data){}, ‘json‘); break; default : alert(e.data); } };</script>
[2]通過GatewayClient發送的資料不會經過Event.php,而是直接經由Gateway進程轉寄給用戶端。GatewayClient無法接收用戶端發來的資料。
Gateway::$registerAddress = ‘127.0.0.1:1236‘;$message = [ ‘type‘ => 4002, ‘clientId‘ => $clientId, ‘publish_time‘ => date(‘Y-m-d h:i:s‘, time()) ];Gateway::bindUid($clientId,$uid);//在這裡發送的資訊是不走Event.php檔案的,直接廣播出去了Gateway::sendToClient($clientId,json_encode($message));
如果GatewayClient和GatewayWorker不是在同一台伺服器上,則需要先將start_gateway.php中的lanIp改成當前伺服器的內網ip(如果不在一個內網可改成公網ip)。
如果GatewayClient和GatewayWorker在同一台伺服器上運行,則不用做任何更改,直接按照樣本使用GatewayClient即可。
一、start_gateway.php檔案,這個檔案是預設的檔案,預設協議是text協議:
// gateway 進程,這裡使用Text協議,可以用telnet測試$gateway = new Gateway("Text://0.0.0.0:8383");
本地測試text協議是否正常命令:
telnet 127.0.0.1 8383
二、測試結果,啟動伺服器
輸入命令測試:
telnet 127.0.0.1 8282
三、自訂一個Websocket串連
例如:copy一個start_gateway_ws.php檔案,:
修改檔案內容:
// gateway_ws 進程$gateway_ws = new Gateway("Websocket://0.0.0.0:8384");// gateway名稱,status方便查看$gateway_ws->name = ‘YourAppGatewayWS‘;
在HTMl頁面調用:
<script language="javascript" type="text/javascript"> var $URL = "__APP__/Home/GatewayWorker/bindUid"; console.log($URL); // 與GatewayWorker建立websocket串連,網域名稱和連接埠改為你實際的網域名稱連接埠 ws = new WebSocket("ws://127.0.0.1:8384"); // 服務端主動推送訊息時會觸發這裡的onmessage ws.onmessage = function(e){ // json資料轉換成js對象 var data = eval("("+e.data+")"); var type = data.type || ‘‘; switch(type){ case ‘init‘: $.post($URL,$data,success,‘json‘); break; default : alert(e.data); } };</script>
四、start_businessworker.php檔案
注意:以上的HTML頁面的WebSocket的連接埠號碼必須的同時對應
// 服務登入位址$worker->registerAddress = ‘你的外網IP地址:1236‘;
可以看出:start_register.php這個檔案是專門管理其他的三個檔案的
注意:一下的register和worker的這個登入位址必須是一樣的,也就是說,worker的登入位址必須和register的一樣的
// register 服務必須是text協議$register = new Register(‘text://0.0.0.0:1236‘);// 服務登入位址$worker->registerAddress = ‘120.120.120.120:1236‘;
例如在TP的Controller中使用的時候這樣串連:調用的是這個檔案中的地址(服務登入位址):start_businessworker.php
Gateway::$registerAddress = ‘120.120.120.120:1236‘; //這個連結的地址是start_register.php Gateway::bindUid($clientId,$uid); Gateway::sendToAll(json_encode($clientId));
:http://www.workerman.net/doc
php-GatewayWorker搭建即時聊天室