Thinkphp workerman gatewayWorker 不能在windows 下启动的解决办法

Thinkphp workerman gatewayWorker 不能在windows 下启动

提示:

GatewayWorker Not Support On Windows.

解决方案:
自定义命令行

代码如下

<?php


namespace app\command;

use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use think\facade\Config;
use think\worker\command\GatewayWorker;
use Workerman\Worker;

/**
 * GatewayWorker win环境下的启动
 *
 * Class GatewayWorkerWin
 * @package app\command
 */
class GatewayWorkerForWin extends GatewayWorker
{
    public function configure()
    {
        $this->setName('worker:gateway_win')
            ->addArgument('service', Argument::OPTIONAL, 'workerman service: gateway|register|business_worker', 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)
            ->setDescription('GatewayWorker Server for ThinkPHP runs on Windows system');
    }

    /**
     * 由于windows下不支持下无法使用status、stop、reload、restart等命令。
     * 所以去掉status、stop、reload、restart、守护进程等命令。
     * 文档说明: https://www.workerman.net/doc/workerman/must-read.html
     *
     * 命令使用:
     * php think worker:gateway_win register
     * php think worker:gateway_win business_worker
     * php think worker:gateway_win gateway
     *
     * @param Input $input
     * @param Output $output
     * @return int|void|null
     */
    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 'business_worker':
                $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|business_worker.</error>");
                exit(1);
                break;
        }

        Worker::runAll();
    }
}

console.php 里面配置

<?php
// +----------------------------------------------------------------------
// | 控制台配置
// +----------------------------------------------------------------------
return [
    // 指令定义
    'commands' => [
        'worker:gateway_win' => 'app\command\GatewayWorkerForWin',
    ],
];

命令行分三次运行

php think worker:gateway_win register
php think worker:gateway_win business_worker
php think worker:gateway_win gateway

========== 解决方案看到这里就可以了,下面是分析与解释 =======================

根据workerman官方说明手册

发现windows下有如下限制

  • windows系统下workerman单个进程仅支持200+个连接。
  • windows系统下无法使用count参数设置多进程。
  • windows系统下无法使用status、stop、reload、restart等命令。
  • windows系统下无法守护进程,cmd窗口关掉后服务即停止。
  • windows系统下无法在一个文件中初始化多个监听。
  • linux系统无上面的限制,建议正式环境用linux系统,开发环境可以选择用windows系统。

查看源码

namespace think\worker\command

/**
 * Worker 命令行类
 */
class GatewayWorker extends Command
{

// 其他代码省略

/**
     * 启动
     * @access public
     * @param  string   $host 监听地址
     * @param  integer  $port 监听端口
     * @param  array    $option 参数
     * @return void
     */
    public function start(string $host, int $port, array $option = [])
    {
        $registerAddress = !empty($option['registerAddress']) ? $option['registerAddress'] : '127.0.0.1:1236';

        if (!empty($option['register_deploy'])) {
            // 分布式部署的时候其它服务器可以关闭register服务
            // 注意需要设置不同的lanIp
            $this->register($registerAddress);
        }

        // 启动businessWorker
        if (!empty($option['businessWorker_deploy'])) {
            $this->businessWorker($registerAddress, $option['businessWorker'] ?? []);
        }

        // 启动gateway
        if (!empty($option['gateway_deploy'])) {
            $this->gateway($registerAddress, $host, $port, $option);
        }

        Worker::runAll();
    }
  }

一个文件里面初始化多个监听
导致thinkphp源码中直接做了判断,在window环境下,不可使用gatewayWorker

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值