diff --git a/Server/Events/OnWorkerError.php b/Server/Events/OnWorkerError.php index 9bf490d5..55cf130d 100644 --- a/Server/Events/OnWorkerError.php +++ b/Server/Events/OnWorkerError.php @@ -13,7 +13,10 @@ class OnWorkerError /** * @param Server $server - * @param int $workerId + * @param int $worker_id + * @param int $worker_pid + * @param int $exit_code + * @param int $signal */ public function __construct(Server $server, int $worker_id, int $worker_pid, int $exit_code, int $signal) { diff --git a/Server/ServerManager.php b/Server/ServerManager.php index 74b3c160..138c0876 100644 --- a/Server/ServerManager.php +++ b/Server/ServerManager.php @@ -79,7 +79,7 @@ class ServerManager */ public function addListener(string $type, string $host, int $port, int $mode, array $settings = []) { - if ($this->portIsAlready($port)) $this->stopServer($port); + if ($this->checkPortIsAlready($port)) $this->stopServer($port); if (!$this->server) { $this->createBaseServer($type, $host, $port, $mode, $settings); } else { @@ -94,6 +94,7 @@ class ServerManager /** * @throws NotFindClassException * @throws ReflectionException + * @throws ConfigException */ public function initBaseServer($configs, int $daemon = 0): void { @@ -107,18 +108,18 @@ class ServerManager /** - * @param $port * @return bool - * @throws Exception + * @throws ConfigException */ - private function checkPort($port): bool + public function isRunner(): bool { - if (Kiri::getPlatform()->isLinux()) { - exec('netstat -tunlp | grep ' . $port, $output); - } else { - exec('lsof -i :' . $port . ' | grep -i "LISTEN"', $output); + $configs = Config::get('server', [], true); + foreach ($this->sortService($configs['ports']) as $config) { + if ($this->checkPortIsAlready($config['port'])) { + return true; + } } - return !empty($output); + return false; } @@ -310,10 +311,10 @@ class ServerManager */ public function stopServer(int $port) { - if (!($pid = $this->portIsAlready($port))) { + if (!($pid = $this->checkPortIsAlready($port))) { return; } - while ($this->portIsAlready($port)) { + while ($this->checkPortIsAlready($port)) { exec('kill ' . $pid, $execResult); usleep(300); } @@ -324,7 +325,7 @@ class ServerManager * @param $port * @return bool|string */ - private function portIsAlready($port): bool|string + private function checkPortIsAlready($port): bool|string { if (!Kiri::getPlatform()->isLinux()) { exec("lsof -i :" . $port . " | grep -i 'LISTEN' | awk '{print $2}'", $output); diff --git a/http-helper/Command.php b/http-helper/Command.php index a3b51ddb..b4e6654e 100644 --- a/http-helper/Command.php +++ b/http-helper/Command.php @@ -38,13 +38,11 @@ class Command extends \Console\Command if (!in_array($dtl->get('action'), self::ACTIONS)) { return 'I don\'t know what I want to do.'; } - - /** @var Shutdown $shutdown */ - $shutdown = Kiri::app()->get('shutdown'); - if ($shutdown->isRunning() && $dtl->get('action') == 'start') { + if ($manager->isRunner() && $dtl->get('action') == 'start') { return 'Service is running. Please use restart.'; } - $shutdown->shutdown(); + + $manager->shutdown(); if ($dtl->get('action') == 'stop') { return 'shutdown success.'; } diff --git a/http-helper/Server.php b/http-helper/Server.php index 132eb30c..ba366f6e 100644 --- a/http-helper/Server.php +++ b/http-helper/Server.php @@ -6,16 +6,15 @@ namespace Http; use Exception; use Http\Abstracts\HttpService; use JetBrains\PhpStorm\Pure; -use ReflectionException; -use Rpc\Service; -use Server\Constant; -use Server\ServerManager; use Kiri\Abstracts\Config; use Kiri\Error\LoggerProcess; use Kiri\Exception\ConfigException; use Kiri\Exception\NotFindClassException; use Kiri\Process\Biomonitoring; -use Kiri\Kiri; +use ReflectionException; +use Rpc\Service; +use Server\Constant; +use Server\ServerManager; use Swoole\Runtime; @@ -123,7 +122,20 @@ class Server extends HttpService */ public function shutdown() { - $this->manager->stopServer(0); + $configs = Config::get('server', [], true); + foreach ($configs['ports'] ?? [] as $config) { + $this->manager->stopServer($config['port']); + } + } + + + /** + * @return bool + * @throws ConfigException + */ + public function isRunner(): bool + { + return $this->manager->isRunner(); }