參考文檔:http://www.workerman.net/gatewaydoc/
目錄結構
├── 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
重新打開一個窗口:Windows 測試結果:
Linux測試結果:
測試成功:
三、自定義一個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));