Workerman是一款純PHP開發的開源高性能的PHP socket 服務器框架,而GatewayWorker則是基於Workerman開發的一個長鏈接框架,支持分佈式部署,支持全局廣播或者向任意客戶端推送數據,做爲快速開發TCP長鏈接應用很是方便;php
說明,本文主要經過手動安裝GatewayWorker擴展,所以拷貝vendor下的核心代碼便可。暫不提供composer安裝說明html
在項目根目錄 新增啓動服務文件server.php,用於在cli模式下運行tpgit
關鍵代碼:github
ini_set('display_errors', 'on');web
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");
}thinkphp
define('APP_PATH', __DIR__ . '/application/');
//綁定默認模塊和控制器
define('BIND_MODULE', 'push/Run');
// 加載框架引導文件
require __DIR__ . '/thinkphp/start.php';windows
Run 控制器:服務器
路徑:/application/push/controller/Run.phpwebsocket
關鍵代碼:app
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 控制器:
路徑:/application/push/controller/Events.php
關鍵代碼:
至此,服務端已經編寫完畢;
使用終端執行命令: php /wwwroot/你的tp5項目/server.php start
集成GatewayWorker擴展,無非就是如何正確加載GatewayWorker相關類庫文件以及設定處理業務的 controller,容易出錯的地方也就是這個地方:
1 GatewayWorker的自動加載
關鍵代碼:
只要確保文件加載正常,後續操做就是將 Register,BusinessWorker和Gateway 初始化,運行便可;
2 $worker->eventHandler,設定處理業務的 controller,tp5使用命名空間,此處一樣須要填寫完整的命名空間;