看到一些人,可能不太明白workerman與thinkphp5是怎么工作的,這里,我引用workerman官方的文章來解釋一下,希望給你們一些參考。
## 與ThinkPHP等框架結合
使用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中Events.php代碼(只有個onConnect回調設置)
~~~
<?php
use \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");
// 服務端主動推送消息時會觸發這里的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('./bind.php', {client_id: data.client_id}, function(data){}, 'json');
break;
// 當mvc框架調用GatewayClient發消息時直接alert出來
default :
alert(e.data);
}
};
~~~
### mvc后端uid綁定代碼片段
bind.php
~~~
<?php
//加載GatewayClient
require_once '/your/path/GatewayClient/Gateway.php';
// GatewayClient 3.0.0版本開始要使用命名空間
use GatewayClient\Gateway;
// 設置GatewayWorker服務的Register服務ip和端口,請根據實際情況改成實際值
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
~~~
<?php
//加載GatewayClient
require_once '/your/path/GatewayClient/Gateway.php';
// GatewayClient 3.0.0版本開始要使用命名空間
use GatewayClient\Gateway;
// 設置GatewayWorker服務的Register服務ip和端口,請根據實際情況改成實際值
Gateway::$registerAddress = '127.0.0.1:1236';
// 向任意uid的網站頁面發送數據
Gateway::sendToUid($uid, $message);
// 向任意群組的網站頁面發送數據
Gateway::sendToGroup($group, $message);
~~~
>[danger] 注意
> 以上僅是mvc框架與GatewayWorker官方推薦的結合方式,并不是強制使用此方式,開發者可以自由變化選擇結合方式以適應自己的業務需求。 當然也可以采用客戶端與GatewayWorker直接雙向通訊的方式完成業務通訊。
## 關于GatewayClient
源碼:
https://github.com/walkor/GatewayClient
>[danger] 注意:
> 如果GatewayClient和GatewayWorker不是在同一臺服務器上,則需要先將start_gateway.php中的lanIp改成當前服務器的內網ip(如果不在一個內網可改成公網ip)。
> 如果GatewayClient和GatewayWorker在同一臺服務器上運行,則不用做任何更改,直接按照示例使用GatewayClient即可。
> 通過GatewayClient發送的數據不會經過Event.php,而是直接經由Gateway進程轉發給客戶端。
> GatewayClient無法接收客戶端發來的數據。
## 客戶端使用示例
~~~
require_once '/your/path/GatewayClient/Gateway.php';
/**
* gatewayClient 3.0.0及以上版本加了命名空間
* 而3.0.0以下版本不需要use GatewayClient\Gateway;
**/
use GatewayClient\Gateway;
/**
*====這個步驟是必須的====
*這里填寫Register服務的ip(通常是運行GatewayWorker的服務器ip)和端口
*注意Register服務端口在start_register.php中可以找到(chat默認是1236)
*這里假設GatewayClient和Register服務都在一臺服務器上,ip填寫127.0.0.1
**/
Gateway::$registerAddress = '127.0.0.1:1236';
// 以下是調用示例,接口與GatewayWorker環境的接口一致
// 接口具體使用方法見《Lib\Gateway類提供的接口》一章
// 注意除了不支持sendToCurrentClient和closeCurrentClient方法
// 其它方法都支持
Gateway::sendToAll($data);
Gateway::sendToClient($client_id, $data);
Gateway::closeClient($client_id);
Gateway::isOnline($client_id);
Gateway::bindUid($client_id, $uid);
Gateway::isUidOnline($uid);
Gateway::getClientIdByUid($uid);
Gateway::unbindUid($client_id, $uid);
Gateway::sendToUid($uid, $data);
Gateway::joinGroup($client_id, $group);
Gateway::sendToGroup($group, $data);
Gateway::leaveGroup($client_id, $group);
Gateway::getClientCountByGroup($group);
Gateway::getClientSessionsByGroup($group);
Gateway::getAllClientCount();
Gateway::getAllClientSessions();
Gateway::setSession($client_id, $session);
Gateway::updateSession($client_id, $session);
Gateway::getSession($client_id);
...
~~~
- ichat系統說明
- workerman與Thinkphp5整合原理
- ichat系統的基礎搭建
- 通用后臺的搭建
- workerman的集成
- layIM的集成
- 管理員后臺功能的實現
- 后臺登錄退出的實現
- 群組管理的設計與實現
- 群組基礎配置
- 群組管理
- 用戶管理
- 聊天設置
- 用戶的舉報
- 聊天系統的設計與實現
- 注冊功能的實現
- 登錄功能的實現(1)
- 登錄功能的實現(2)
- 登錄功能的實現(3)
- 登錄功能的實現(4)
- 修改個人資料的實現
- 修改個性簽名的實現
- 切換在線狀態的實現
- 添加好友的實現
- 消息盒子
- 用意/拒絕好友(1)
- 同意/拒絕好友(2)
- 好友聊天的實現
- 創建群組的實現
- 按條件查找群組
- 申請加入群組
- 管理我的群組
- 群組聊天
- 右鍵退出群組
- 發送語音
- 發送圖片
- 發送文件
- 用戶空間功能
- 查看聊天記錄
- 進入好友空間
- 將好友加入黑名單
- 移動好友分組
- 刪除好友
- 舉報好友
- ichat(移動版)
- 登錄的實現
- 聊天的實現
- live客服模式
- 數據字典
- 全國區域數據
- 系統整體結構說明
- main.js全部代碼
- 源碼下載