TP5手动集成GatewayWorker

重点://由于是手动添加,因此需要注册命名空间,方便自动加载,具体代码路径以实际情况为准

hinkLoader::addNamespace([

'Workerman' => EXTEND_PATH . 'Workerman/workerman',

'GatewayWorker' =>EXTEND_PATH . 'Workerman/gateway-worker/src',

]);

也可以放到vendor目录下,用VENDOR_PATH加载

切记,'Workerman/gateway-worker/src'文件名不能有数字和其他特殊字符

比如:'Workerman/gateway-worker/src-3.0.0'就不行

TP5官方已经集成Workerman,但并未实现GatewayWorker的接入,本文讲述如何在tp5内集成GatewayWorker。

Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架,而GatewayWorker则是基于Workerman开发的一个长连接框架,支持分布式部署,支持全局广播或者向任意客户端推送数据,作为快速开发TCP长连接应用非常方便;然而tp5的官方手册并未讲述如何接入GatewayWorker 扩展,本文将通过代码说明如何在TP5中加入此扩展;

第一步:下载GatewayWorker(Fork地址 https://github.com/walkor/gatewayworker)

第二步:将GatewayWorker文件夹中的“GatewayWorkervendor”下“Workerman”放入tp5项目extend目录

说明,本文主要通过手动安装GatewayWorker扩展,因此拷贝vendor下的核心代码即可。暂不提供composer安装说明。

第三步:添加入口文件

在项目根目录 新增启动服务文件server.php,用于在cli模式下运行tp

关键代码:

ini_set('display_errors', 'on');

if(strpos(strtolower(PHP_OS), 'win') === 0)

{

exit("start.php not support windows.
");

}

// 检查扩展

if(!extension_loaded('pcntl'))

{

exit("Please install pcntl extension. See http://doc3.workerman.net/appendices/install-extension.html
");

}

if(!extension_loaded('posix'))

{

exit("Please install posix extension. See http://doc3.workerman.net/appendices/install-extension.html
");

}

define('APP_PATH', __DIR__ . '/application/');

//绑定默认模块和控制器

define('BIND_MODULE','push/Run');

// 加载框架引导文件

require __DIR__ . '/thinkphp/start.php';

复制代码

第四步:编写GatewayWorker运行代码

Run 控制器:

路径:/application/push/controller/Run.php

关键代码:

use WorkermanWorker;

use GatewayWorkerRegister;

use GatewayWorkerBusinessWorker;

use GatewayWorkerGateway;

//控制器无需继承Controller

/**

* 构造函数

* @access public

*/

public function __construct()

{

//由于是手动添加,因此需要注册命名空间,方便自动加载,具体代码路径以实际情况为准

hinkLoader::addNamespace([

'Workerman' => EXTEND_PATH . 'Workerman/workerman',

'GatewayWorker' =>EXTEND_PATH . 'Workerman/gateway-worker/src',

]);

//初始化各个GatewayWorker

//初始化register

new Register('text://0.0.0.0:1238');

//初始化 bussinessWorker 进程

$worker = new BusinessWorker();

$worker->name = 'YourAppBusinessWorker';

$worker->count = 4;

$worker->registerAddress = '127.0.0.1:1238';

//设置处理业务的类,此处制定Events的命名空间

$worker->eventHandler = 'apppushcontrollerEvents';

// 初始化 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代码包中GatewayWorkerApplicationsYourApp的Events.php代码

//也可使用TP的各种函数和类库

复制代码

至此,服务端已经编写完毕;

第六步:运行程序

使用终端执行命令:

php /wwwroot/你的tp5项目/server.php start

OK,程序已经正常运行;

总结:集成GatewayWorker扩展,无非就是如何正确加载GatewayWorker相关类库文件以及设定处理业务的 controller,容易出错的地方也就是这个地方:

1 GatewayWorker的自动加载

关键代码:

hinkLoader::addNamespace([

'Workerman' => EXTEND_PATH . 'Workerman/workerman',

'GatewayWorker' =>EXTEND_PATH . 'Workerman/gateway-worker/src',

]);

复制代码

只要确保文件加载正常,后续操作就是将 Register,BusinessWorker和Gateway 初始化,运行即可;

2 $worker->eventHandler,设定处理业务的 controller,tp5使用命名空间,此处同样需要填写完整的命名空间;