setDescription("Run a simple http server | 启动一个简单的文件 HTTP 服务器"); $this->setHelp("直接运行可以启动"); $this->addArgument('dir', InputArgument::REQUIRED, 'Your directory'); $this->addOption("host", 'H', InputOption::VALUE_REQUIRED, "启动监听地址"); $this->addOption("port", 'P', InputOption::VALUE_REQUIRED, "启动监听地址的端口"); // ... } protected function execute(InputInterface $input, OutputInterface $output): int { $tty_width = explode(" ", trim(exec("stty size")))[1]; if (realpath($input->getArgument('dir') ?? '.') === false) { $output->writeln("Directory error(" . ($input->getArgument('dir') ?? '.') . "): no such file or directory."); return self::FAILURE; } ZMConfig::setDirectory(DataProvider::getSourceRootDir() . '/config'); $global = ZMConfig::get("global"); $host = $input->getOption("host") ?? $global["host"]; $port = $input->getOption("port") ?? $global["port"]; $index = ["index.html", "index.htm"]; $out = [ "listen" => $host.":".$port, "version" => ZM_VERSION, "web_root" => realpath($input->getArgument('dir') ?? '.'), "index" => implode(",", $index) ]; Framework::printProps($out, $tty_width); $server = new Server($host, $port); $server->set(ZMConfig::get("global", "swoole")); Console::init(2, $server); ZMAtomic::$atomics["request"] = []; for ($i = 0; $i < 32; ++$i) { ZMAtomic::$atomics["request"][$i] = new Atomic(0); } $server->on("request", function (Request $request, Response $response) use ($input, $index, $server) { ZMAtomic::$atomics["request"][$server->worker_id]->add(1); HttpUtil::handleStaticPage( $request->server["request_uri"], $response, [ "document_root" => realpath($input->getArgument('dir') ?? '.'), "document_index" => $index ]); //echo "\r" . Coroutine::stats()["coroutine_peak_num"]; }); $server->on("start", function ($server) { Process::signal(SIGINT, function () use ($server) { echo "\r"; Console::warning("Server interrupted by keyboard."); for ($i = 0; $i < 32; ++$i) { $num = ZMAtomic::$atomics["request"][$i]->get(); if ($num != 0) echo "[$i]: " . $num . "\n"; } $server->shutdown(); $server->stop(); }); Console::success("Server started. Use Ctrl+C to stop."); }); $server->start(); // return this if there was no problem running the command // (it's equivalent to returning int(0)) return 0; // or return this if some error happened during the execution // (it's equivalent to returning int(1)) // return 1; } }