Workerman是一款純PHP開發的開源高性能的PHP socket 服務器框架,而GatewayWorker則是基於Workerman開發的一個長連接框架,支持分布式部署,支持全局廣播或者向任意客戶端推送數據,作為快速開發TCP長連接應用非常方便;
說明,本文主要通過手動安裝GatewayWorker擴展,因此拷貝vendor下的核心代碼即可。暫不提供composer安裝說明
第一步:下載GatewayWorker(Fork地址 https://github.com/walkor/gatewayworker)
第二步:將GatewayWorker文件夾中的“GatewayWorker\vendor\”下“Workerman”放入tp5項目extend目錄
第三步:添加入口文件
在項目根目錄 新增啟動服務文件server.php,用於在cli模式下運行tp
關鍵代碼:
ini_set('display_errors', 'on');
if(strpos(strtolower(PHP_OS), 'win') === 0){
exit("start.php not support windows.\n");
}
// 檢查擴展
if(!extension_loaded('pcntl')){
exit("Please install pcntl extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
}
if(!extension_loaded('posix')){
exit("Please install posix extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
}
define('APP_PATH', __DIR__ . '/application/');
//綁定默認模塊和控制器
define('BIND_MODULE', 'push/Run');
// 加載框架引導文件
require __DIR__ . '/thinkphp/start.php';
第四步:編寫GatewayWorker運行代碼
Run 控制器:
路徑:/application/push/controller/Run.php
關鍵代碼:
use Workerman\Worker;
use GatewayWorker\Register;
use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;
//控制器無需繼承Controller
/**
* 構造函數
* @access public
*/
public function __construct(){
//由於是手動添加,因此需要注冊命名空間,方便自動加載,具體代碼路徑以實際情況為准
\think\Loader::addNamespace([
'Workerman' => EXTEND_PATH . 'Workerman/workerman',
'GatewayWorker' =>EXTEND_PATH . 'Workerman/gateway-worker/src',
]);
/初始化各個GatewayWorker
//1.初始化register
new Register('text://0.0.0.0:1238');
//2.初始化 bussinessWorker 進程
$worker = new BusinessWorker();
$worker->name = 'YourAppBusinessWorker';
$worker->count = 4;
$worker->registerAddress = '127.0.0.1:1238';
//3.設置處理業務的類,此處制定Events的命名空間
$worker->eventHandler = '\app\push\controller\Events';
//4.初始化 gateway 進程
$gateway = new Gateway("websocket://0.0.0.0:8282");
$gateway->name = 'YourAppGateway';
$gateway->count = 4;
$gateway->lanIp = '127.0.0.1';
$gateway->startPort = 2900;
$gateway->registerAddress = '127.0.0.1:1238';
//運行所有Worker;
Worker::runAll();
}
第五步:編寫Events.php 進行業務處理;
Events 控制器:
路徑:/application/push/controller/Events.php
關鍵代碼:
- 可直接使用GatewayWorker代碼包中GatewayWorker\Applications\YourApp的Events.php代碼
- 也可使用TP的各種函數和類庫
至此,服務端已經編寫完畢;
第六步:運行程序
使用終端執行命令: php /wwwroot/你的tp5項目/server.php start
總結:
集成GatewayWorker擴展,無非就是如何正確加載GatewayWorker相關類庫文件以及設定處理業務的 controller,容易出錯的地方也就是這個地方:
1 GatewayWorker的自動加載
關鍵代碼:
- \think\Loader::addNamespace([
- 'Workerman' => EXTEND_PATH . 'Workerman/workerman',
- 'GatewayWorker' =>EXTEND_PATH . 'Workerman/gateway-worker/src',
- ]);
只要確保文件加載正常,后續操作就是將 Register,BusinessWorker和Gateway 初始化,運行即可;
2 $worker->eventHandler,設定處理業務的 controller,tp5使用命名空間,此處同樣需要填寫完整的命名空間;