查看: 4239|回复: 0

[Thinkphp] ThinkPhp5集成GatewayWorker

[复制链接]
发表于 2017-8-29 00:05:58 | 显示全部楼层 |阅读模式

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

第一步:下载GatewayWorker(Fork地址 https://github.com/walkor/gatewayworker
第二步:将GatewayWorker文件夹中的“GatewayWorker\vendor\”下“Workerman”放入tp5项目extend目录
说明,本文主要通过手动安装GatewayWorker扩展,因此拷贝vendor下的核心代码即可。暂不提供composer安装说明。

第三步:添加入口文件
在项目根目录 新增启动服务文件server.php,用于在cli模式下运行tp
关键代码:
  1. ini_set('display_errors', 'on');
  2. if(strpos(strtolower(PHP_OS), 'win') === 0)
  3. {
  4.     exit("start.php not support windows.\n");
  5. }
  6. // 检查扩展
  7. if(!extension_loaded('pcntl'))
  8. {
  9.     exit("Please install pcntl extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
  10. }
  11. if(!extension_loaded('posix'))
  12. {
  13.     exit("Please install posix extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
  14. }
  15. define('APP_PATH', __DIR__ . '/application/');
  16. //绑定默认模块和控制器
  17. define('BIND_MODULE','push/Run');
  18. // 加载框架引导文件
  19. require __DIR__ . '/thinkphp/start.php';
复制代码


第四步:编写GatewayWorker运行代码
Run 控制器:
路径:/application/push/controller/Run.php
关键代码:
  1. use Workerman\Worker;
  2. use GatewayWorker\Register;
  3. use GatewayWorker\BusinessWorker;
  4. use GatewayWorker\Gateway;
  5. //控制器无需继承Controller
  6.   /**
  7.      * 构造函数
  8.      * @access public
  9.      */
  10.     public function __construct()
  11.     {
  12.         //由于是手动添加,因此需要注册命名空间,方便自动加载,具体代码路径以实际情况为准
  13.         \think\Loader::addNamespace([
  14.             'Workerman' => EXTEND_PATH . 'Workerman/workerman',
  15.             'GatewayWorker' =>EXTEND_PATH . 'Workerman/gateway-worker/src',
  16.         ]);
  17.         
  18.         //初始化各个GatewayWorker
  19.     //初始化register
  20.     new Register('text://0.0.0.0:1238');
  21.      
  22.      //初始化 bussinessWorker 进程
  23.     $worker = new BusinessWorker();
  24.     $worker->name = 'YourAppBusinessWorker';
  25.     $worker->count = 4;
  26.     $worker->registerAddress = '127.0.0.1:1238';
  27.         //设置处理业务的类,此处制定Events的命名空间
  28.         $worker->eventHandler = '\app\push\controller\Events';
  29.     // 初始化 gateway 进程
  30.     $gateway = new Gateway("websocket://0.0.0.0:8282");
  31.     $gateway->name = 'YourAppGateway';
  32.     $gateway->count = 4;
  33.     $gateway->lanIp = '127.0.0.1';
  34.     $gateway->startPort = 2900;
  35.     $gateway->registerAddress = '127.0.0.1:1238';
  36.      
  37.      //运行所有Worker;
  38.     Worker::runAll();
  39.     }
复制代码


第五步:编写Events.php 进行业务处理;
Events 控制器:
路径:/application/push/controller/Events.php
关键代码:
  1. //可直接使用GatewayWorker代码包中GatewayWorker\Applications\YourApp的Events.php代码
  2. //也可使用TP的各种函数和类库
复制代码


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


第六步:运行程序
使用终端执行命令:
  1. php /wwwroot/你的tp5项目/server.php start
复制代码


OK,程序已经正常运行;


总结:集成GatewayWorker扩展,无非就是如何正确加载GatewayWorker相关类库文件以及设定处理业务的 controller,容易出错的地方也就是这个地方:
1 GatewayWorker的自动加载
关键代码:
  1. \think\Loader::addNamespace([
  2.             'Workerman' => EXTEND_PATH . 'Workerman/workerman',
  3.             'GatewayWorker' =>EXTEND_PATH . 'Workerman/gateway-worker/src',
  4.         ]);
复制代码


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

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


附录:
1 tp5的Workerman的扩展,详见ttps://www.kancloud.cn/manual/thinkphp5/235128
2 Workerman官网:http://www.workerman.net/
3 Workerman手册:http://www.workerman.net/doc
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表 发新帖

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

快速回复 返回顶部 返回列表