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使用命名空间,此处一样须要填写完整的命名空间;