// +---------------------------------------------------------------------- namespace think\worker\command; 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\App; use think\facade\Config; use think\worker\Http as HttpServer; /** * Worker 命令行类 */ class Worker extends Command { protected $config = []; public function configure() { $this->setName('worker') ->addArgument('action', Argument::OPTIONAL, "start|stop|restart|reload|status|connections", 'start') ->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_NONE, 'Run the workerman server in daemon mode.') ->setDescription('Workerman HTTP Server for ThinkPHP'); } public function execute(Input $input, Output $output) { $action = $input->getArgument('action'); if (DIRECTORY_SEPARATOR !== '\\') { if (!in_array($action, ['start', 'stop', 'reload', 'restart', 'status', 'connections'])) { $output->writeln("Invalid argument action:{$action}, Expected start|stop|restart|reload|status|connections ."); return false; } global $argv; array_shift($argv); array_shift($argv); array_unshift($argv, 'think', $action); } elseif ('start' != $action) { $output->writeln("Not Support action:{$action} on Windows."); return false; } if ('start' == $action) { $output->writeln('Starting Workerman http server...'); } $this->config = Config::get('worker'); if (isset($this->config['context'])) { $context = $this->config['context']; unset($this->config['context']); } else { $context = []; } $host = $this->getHost(); $port = $this->getPort(); $worker = new HttpServer($host, $port, $context); if (empty($this->config['pidFile'])) { $this->config['pidFile'] = App::getRootPath() . 'runtime/worker.pid'; } // 避免pid混乱 $this->config['pidFile'] .= '_' . $port; // 设置应用根目录 $worker->setRootPath(App::getRootPath()); // 应用设置 if (!empty($this->config['app_init'])) { $worker->appInit($this->config['app_init']); unset($this->config['app_init']); } // 开启守护进程模式 if ($this->input->hasOption('daemon')) { $worker->setStaticOption('daemonize', true); } // 开启HTTPS访问 if (!empty($this->config['ssl'])) { $this->config['transport'] = 'ssl'; unset($this->config['ssl']); } // 设置网站目录 if (empty($this->config['root'])) { $this->config['root'] = App::getRootPath() . 'public'; } $worker->setRoot($this->config['root']); unset($this->config['root']); // 设置文件监控 if (DIRECTORY_SEPARATOR !== '\\' && (App::isDebug() || !empty($this->config['file_monitor']))) { $interval = $this->config['file_monitor_interval'] ?? 2; $paths = !empty($this->config['file_monitor_path']) ? $this->config['file_monitor_path'] : [App::getAppPath(), App::getConfigPath()]; $worker->setMonitor($interval, $paths); unset($this->config['file_monitor'], $this->config['file_monitor_interval'], $this->config['file_monitor_path']); } // 全局静态属性设置 foreach ($this->config as $name => $val) { if (in_array($name, ['stdoutFile', 'daemonize', 'pidFile', 'logFile'])) { $worker->setStaticOption($name, $val); unset($this->config[$name]); } } // 设置服务器参数 $worker->option($this->config); if (DIRECTORY_SEPARATOR == '\\') { $output->writeln('You can exit with `CTRL-C`'); } $worker->start(); } protected function getHost(string $default = '0.0.0.0') { if ($this->input->hasOption('host')) { $host = $this->input->getOption('host'); } else { $host = !empty($this->config['host']) ? $this->config['host'] : $default; } return $host; } protected function getPort(string $default = '2346') { if ($this->input->hasOption('port')) { $port = $this->input->getOption('port'); } else { $port = !empty($this->config['port']) ? $this->config['port'] : $default; } return $port; } }