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


    Thinkphp workerman gatewayWorker 不能在windows 下启动

    提示:

    GatewayWorker Not Support On Windows.

    解决方案:
    自定义命令行

    代码如下

    
    
    
    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("Invalid argument action:{$service}, Expected gateway|register|business_worker.");
                    exit(1);
                    break;
            }
    
            Worker::runAll();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    console.php 里面配置

     [
            'worker:gateway_win' => 'app\command\GatewayWorkerForWin',
        ],
    ];
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    命令行分三次运行

    php think worker:gateway_win register
    php think worker:gateway_win business_worker
    php think worker:gateway_win gateway
    
    • 1
    • 2
    • 3

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

    根据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();
        }
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

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

  • 相关阅读:
    PromptPort:为大模型定制的创意AI提示词工具库
    草稿草稿草稿,python 和VBA的差别对比汇总 收集ing
    三菱FX3U——ST编程IF判断
    中国石油大学(北京)-《 油气田开发方案设计》第一阶段在线作业
    Flutter-使用 typedef的注意事项
    Docker高级-4.可视化工具Portainer/容器监控之CAdvisor+InfluxDB+Granfana
    美团面试官:高并发、任务执行时间短的业务怎样使用线程池?
    如何使用SVN或者Git回滚代码,你必须知道的三种场景
    实用电脑软件分享,来看看有没有你正在用的
    27岁想转行IT,还来得及吗?
  • 原文地址:https://blog.csdn.net/fendouweiqian/article/details/127691416