tp6 win10下启动Gateway-Worker
来源:blog.csdn.net 发布时间:2021-05-07 00:25
thinkphp版本:6
tp6运行命令行php think worker:gateway出现GatewayWorker Not Support On Windows.是因为在tp5.1的命令行中做了判定,不支持windows环境下运行。
这里不支持windows环境并不是说gateway worker不支持windows,而是tp6的命令行运行方式不支持windows,原因是(在官方文档中有说明):
windows操作系统下无法在一个php文件里初始化多个Worker
tp6的命令php think worker:gateway就是在同一个php文件里启动了多个worker,因为不能成功运行所以tp6的命令行提前做了判定,显示不支持在windows下运行。
按照官方文档的说明,只要分开启动就好了。
解决方案:
最简单一点的:按照官方文档,建立多个文件分开运行worker。
高大上一点的(瞎折腾):自己写tp的命令行,实质还是将多个worker放在不同的文件中运行。
附:自定义TP命令行
命令行文件application\common\command\Workerman.php
这个文件放哪里都无所谓,只要和对应的command参数配置对应就好了
在application\command.php命令行参数配置文件中添加
return [
'workerman' => '\\app\\common\\command\\Workerman',
];
运行方式: php think workerman gateway|register|businessworker
这里是是直接修改了官方的php think worker:gateway命令,因为windows不支持reload等启动方式,所以取消了action的启动参数,改为了服务名称service,例如启动 worker register服务php think workerman register,所以在这里得开3个命令窗口分别运行 register、businessworker、gateway
更新时间:2024-12-18 20:26
tp6运行命令行php think worker:gateway出现GatewayWorker Not Support On Windows.是因为在tp5.1的命令行中做了判定,不支持windows环境下运行。
这里不支持windows环境并不是说gateway worker不支持windows,而是tp6的命令行运行方式不支持windows,原因是(在官方文档中有说明):
windows操作系统下无法在一个php文件里初始化多个Worker
tp6的命令php think worker:gateway就是在同一个php文件里启动了多个worker,因为不能成功运行所以tp6的命令行提前做了判定,显示不支持在windows下运行。
按照官方文档的说明,只要分开启动就好了。
解决方案:
最简单一点的:按照官方文档,建立多个文件分开运行worker。
高大上一点的(瞎折腾):自己写tp的命令行,实质还是将多个worker放在不同的文件中运行。
附:自定义TP命令行
命令行文件application\common\command\Workerman.php
<?php namespace app\common\command; use GatewayWorker\BusinessWorker; use GatewayWorker\Gateway; use GatewayWorker\Register; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\console\input\Option; use think\console\Output; use think\facade\Config; use Workerman\Worker; /** * Worker 命令行 */ class Workerman extends Command { protected function configure() { $this->setName('workerman') ->addArgument('service', Argument::OPTIONAL, 'workerman service: gateway|register|businessworker', null) ->addOption('host', 'H', Option::VALUE_OPTIONAL, 'the host of workerman server', null) ->addOption('port', 'P', Option::VALUE_OPTIONAL, 'the port of workerman server', null) ->addOption('daemon', 'd', Option::VALUE_OPTIONAL, 'Run the workerman server in daemon mode.') ->setDescription('workerman Server for ThinkPHP'); } public function execute(Input $input, Output $output) { $service = $input->getArgument('service'); $option = Config::get('gateway_worker'); if ($input->hasOption('host')) { $host = $input->getOption('host'); } else { $host = !empty($option['host']) ? $option['host'] : '0.0.0.0'; } if ($input->hasOption('port')) { $port = $input->getOption('port'); } else { $port = !empty($option['port']) ? $option['port'] : '2347'; } $registerAddress = !empty($option['registerAddress']) ? $option['registerAddress'] : '127.0.0.1:1236'; switch ($service) { case 'register': $this->register($registerAddress); break; case 'businessworker': $this->businessWorker($registerAddress, isset($option['businessWorker']) ? $option['businessWorker'] : []); break; case 'gateway': $this->gateway($registerAddress, $host, $port, $option); break; default: $output->writeln("<error>Invalid argument action:{$service}, Expected gateway|register|businessworker .</error>"); exit(1); } Worker::runAll(); } /** * 启动register * @access public * @param string $registerAddress * @return void */ public function register($registerAddress) { // 初始化register new Register('text://' . $registerAddress); } /** * 启动businessWorker * @access public * @param string $registerAddress registerAddress * @param array $option 参数 * @return void */ public function businessWorker($registerAddress, $option = []) { // 初始化 bussinessWorker 进程 $worker = new BusinessWorker(); $this->option($worker, $option); $worker->registerAddress = $registerAddress; } /** * 启动gateway * @access public * @param string $registerAddress registerAddress * @param string $host 服务地址 * @param integer $port 监听端口 * @param array $option 参数 * @return void */ public function gateway($registerAddress, $host, $port, $option = []) { // 初始化 gateway 进程 if (!empty($option['socket'])) { $socket = $option['socket']; unset($option['socket']); } else { $protocol = !empty($option['protocol']) ? $option['protocol'] : 'websocket'; $socket = $protocol . '://' . $host . ':' . $port; unset($option['host'], $option['port'], $option['protocol']); } $gateway = new Gateway($socket, isset($option['context']) ? $option['context'] : []); // 以下设置参数都可以在配置文件中重新定义覆盖 $gateway->name = 'Gateway'; $gateway->count = 4; $gateway->lanIp = '127.0.0.1'; $gateway->startPort = 2000; $gateway->pingInterval = 30; $gateway->pingNotResponseLimit = 0; $gateway->pingData = '{"type":"ping"}'; $gateway->registerAddress = $registerAddress; // 全局静态属性设置 foreach ($option as $name => $val) { if (in_array($name, ['stdoutFile', 'daemonize', 'pidFile', 'logFile'])) { Worker::${$name} = $val; unset($option[$name]); } } $this->option($gateway, $option); } /** * 设置参数 * @access protected * @param Worker $worker Worker对象 * @param array $option 参数 * @return void */ protected function option($worker, array $option = []) { // 设置参数 if (!empty($option)) { foreach ($option as $key => $val) { $worker->$key = $val; } } } }
在application\command.php命令行参数配置文件中添加
return [
'workerman' => '\\app\\common\\command\\Workerman',
];
运行方式: php think workerman gateway|register|businessworker
这里是是直接修改了官方的php think worker:gateway命令,因为windows不支持reload等启动方式,所以取消了action的启动参数,改为了服务名称service,例如启动 worker register服务php think workerman register,所以在这里得开3个命令窗口分别运行 register、businessworker、gateway
更新时间:2024-12-18 20:26