GatewayWorker與ThinkPHP等架構結合的介紹

來源:互聯網
上載者:User
這篇文章主要介紹了關於GatewayWorker與ThinkPHP等架構結合的介紹,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

使用GatewayWorker時開發人員最關心的是如何與現有mvc架構(ThinkPHP Yii laravel等)整合,以下是官方推薦的整合方式。

見:

## 總體原則

現有mvc架構項目GatewayWorker獨立部署互不干擾

所有的商務邏輯都由網站頁面post/get到mvc架構中完成

GatewayWorker不接受用戶端發來的資料,即GatewayWorker不處理任何商務邏輯GatewayWorker僅僅當做一個單向的推送通道

僅當mvc架構需要向瀏覽器主動推送資料時才在mvc架構中調用Gateway的API(GatewayClient)完成推送

## 具體實現步驟

1、網站頁面建立與GatewayWorkerwebsocket串連

2、GatewayWorker發現有頁面發起串連時,將對應串連的client_id發給網站頁面

3、網站頁面收到client_id後觸發一個ajax請求(假設是bind.php)將client_id發到mvc後端

4、mvc後端bind.php收到client_id後利用GatewayClient調用Gateway::bindUid($client_id, $uid)client_id與當前uid(使用者id或者用戶端唯一標識)綁定。如果有群組、群發功能,也可以利用Gateway::joinGroup($client_id, $group_id)將client_id加入到對應分組

5、頁面發起的所有請求都直接post/get到mvc架構統一處理,包括髮送訊息

6、mvc架構處理業務過程中需要向某個uid或者某個群組發送資料時,直接調用GatewayClient的介面Gateway::sendToUid Gateway::sendToGroup 等發送即可

## 範例程式碼

### GatewayWorker片段

GatewayWorker中Events.php代碼(只有個onConnect回調設定)

<?phpuse \GatewayWorker\Lib\Gateway;class Events{    // 當有用戶端串連時,將client_id返回,讓mvc架構判斷當前uid並執行綁定    public static function onConnect($client_id)    {        Gateway::sendToClient($client_id, json_encode(array(            'type'      => 'init',            'client_id' => $client_id        )));    }    // GatewayWorker建議不做任何商務邏輯,onMessage留空即可    public static function onMessage($client_id, $message)    {    }}

### 網站頁面js片段

/** * 與GatewayWorker建立websocket串連,網域名稱和連接埠改為你實際的網域名稱連接埠, * 其中連接埠為Gateway連接埠,即start_gateway.php指定的連接埠。 * start_gateway.php 中需要指定websocket協議,像這樣 * $gateway = new Gateway(websocket://0.0.0.0:7272); */ws = new WebSocket("ws://your_domain.com:7272");// 服務端主動推送訊息時會觸發這裡的onmessagews.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('./bind.php', {client_id: data.client_id}, function(data){}, 'json');            break;        // 當mvc架構調用GatewayClient發訊息時直接alert出來        default :            alert(e.data);    }};

### mvc後端uid綁定程式碼片段

bind.php (利用GatewayClient綁定)

<?php//載入GatewayClient。關於GatewayClient參見本頁面底部介紹require_once '/your/path/GatewayClient/Gateway.php';// GatewayClient 3.0.0版本開始要使用命名空間use GatewayClient\Gateway;// 設定GatewayWorker服務的Register服務ip和連接埠,請根據實際情況改成實際值(ip不能是0.0.0.0)Gateway::$registerAddress = '127.0.0.1:1236';// 假設使用者已經登入,使用者uid和群組id在session中$uid      = $_SESSION['uid'];$group_id = $_SESSION['group'];// client_id與uid綁定Gateway::bindUid($client_id, $uid);// 加入某個群組(可調用多次加入多個群組)Gateway::joinGroup($client_id, $group_id);

### mvc後端發訊息程式碼片段

send_message.php (利用GatewayClient發送)

<?php//載入GatewayClient。關於GatewayClient參見本頁面底部介紹require_once '/your/path/GatewayClient/Gateway.php';// GatewayClient 3.0.0版本開始要使用命名空間use GatewayClient\Gateway;// 設定GatewayWorker服務的Register服務ip和連接埠,請根據實際情況改成實際值(ip不能是0.0.0.0)Gateway::$registerAddress = '127.0.0.1:1236';// 向任意uid的網站頁面發送資料Gateway::sendToUid($uid, $message);// 向任意群組的網站頁面發送資料Gateway::sendToGroup($group, $message);

注意

以上僅是mvc架構與GatewayWorker官方推薦的結合方式,並不是強制使用此方式,開發人員可以自由變化選擇結合方式以適應自己的業務需求。


當然也可以採用用戶端與GatewayWorker直接雙向通訊的方式完成業務通訊。

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.