使用GatewayWorker時開發者最關心的是如何與現有mvc框架(ThinkPHP Yii laravel等)整合,以下是官方推薦的整合方式。
見示意圖:
現有mvc框架項目與GatewayWorker獨立部署互不干擾
所有的業務邏輯都由網站頁面post/get到mvc框架中完成
GatewayWorker不接受客戶端發來的數據,即GatewayWorker不處理任何業務邏輯,GatewayWorker僅僅當做一個單向的推送通道
僅當mvc框架需要向瀏覽器主動推送數據時才在mvc框架中調用Gateway的API(GatewayClient)完成推送
## 具體實現步驟1、網站頁面建立與GatewayWorker的websocket連接
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;html' target='_blank'>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直接雙向通訊的方式完成業務通訊。
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !
相關推薦:
Yii1.1框架關于日志配置的使用
用laravel dingo api插件庫創建api的方法
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答