1. 程式人生 > >php-GatewayWorker搭建實時聊天室

php-GatewayWorker搭建實時聊天室

publish span ons 文件的 java 名稱 time() eva 一個

├── 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搭建實時聊天室