From 0a6fdda7200fb75d0040b5574d18443e9cead362 Mon Sep 17 00:00:00 2001 From: Administrator Date: Fri, 19 Nov 2021 02:54:05 +0800 Subject: [PATCH] 1 --- kiri-engine/FileListen/HotReload.php | 235 ++++++++++++++------------- 1 file changed, 120 insertions(+), 115 deletions(-) diff --git a/kiri-engine/FileListen/HotReload.php b/kiri-engine/FileListen/HotReload.php index d2e89ae3..c9f6f54b 100644 --- a/kiri-engine/FileListen/HotReload.php +++ b/kiri-engine/FileListen/HotReload.php @@ -21,142 +21,147 @@ class HotReload extends Command { - public bool $isReloading = false; - public bool $isReloadingOut = false; - public ?array $dirs = []; + public bool $isReloading = FALSE; + public bool $isReloadingOut = FALSE; + public ?array $dirs = []; - public int $events; + public int $events; - public int $int = -1; + public int $int = -1; - private ?Process $process = null; + private ?Process $process = NULL; - protected mixed $source = null; + protected mixed $source = NULL; - protected mixed $pipes = []; + protected mixed $pipes = []; - protected ?Coroutine\Channel $channel = null; + protected ?Coroutine\Channel $channel = NULL; - /** - * - */ - protected function configure() - { - $this->setName('sw:wather') - ->setDescription('server start'); - } + /** + * + */ + protected function configure() + { + $this->setName('sw:wather') + ->setDescription('server start'); + } - /** - * @param InputInterface $input - * @param OutputInterface $output - * @return int - * @throws ConfigException - * @throws Exception - */ - public function execute(InputInterface $input, OutputInterface $output): int - { - // TODO: Implement onHandler() method. - set_error_handler([$this, 'onErrorHandler']); + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int + * @throws ConfigException + * @throws Exception + */ + public function execute(InputInterface $input, OutputInterface $output): int + { + // TODO: Implement onHandler() method. + set_error_handler([$this, 'onErrorHandler']); - $this->dirs = Config::get('inotify', [APP_PATH . 'app']); - if (!extension_loaded('inotify')) { - $driver = Kiri::getDi()->get(Scaner::class, [$this->dirs, $this]); - } else { - $driver = Kiri::getDi()->get(Inotify::class, [$this->dirs, $this]); - } - if (Kiri::getPlatform()->isLinux()) { - swoole_set_process_name('[' . Config::get('id', 'sw service.') . '].sw:wather'); - } - $this->trigger_reload(); - pcntl_signal(SIGTERM | SIGKILL, function ($data) { - var_dump($data); - $pid = file_get_contents(storage('.swoole.pid')); - if (!empty($pid) && Process::kill($pid, 0)) { - Process::kill($pid, SIGTERM); - } - }); - $driver->start(); - return 0; - } + $this->dirs = Config::get('inotify', [APP_PATH . 'app']); + if (!extension_loaded('inotify')) { + $driver = Kiri::getDi()->get(Scaner::class, [$this->dirs, $this]); + } else { + $driver = Kiri::getDi()->get(Inotify::class, [$this->dirs, $this]); + } + if (Kiri::getPlatform()->isLinux()) { + swoole_set_process_name('[' . Config::get('id', 'sw service.') . '].sw:wather'); + } + $this->trigger_reload(); + Process::signal(SIGKILL, [$this, 'onSignal']); + Process::signal(SIGTERM, [$this, 'onSignal']); + $driver->start(); + return 0; + } - /** - * @throws Exception - */ - public function onExit() - { - $data = Coroutine::waitSignal(SIGTERM | SIGKILL, -1); - if ($data) { - $pid = file_get_contents(storage('.swoole.pid')); - if (!empty($pid) && Process::kill($pid, 0)) { - Process::kill($pid, SIGTERM); - } - $this->stop(); - $this->source = null; - } - } + public function onSignal($data) + { + var_dump($data); + $pid = file_get_contents(storage('.swoole.pid')); + if (!empty($pid) && Process::kill($pid, 0)) { + Process::kill($pid, SIGTERM); + } + } - /** - * @throws Exception - */ - private function stop(): void - { - if (is_resource($this->source)) { - proc_terminate($this->source); - while (proc_get_status($this->source)['running']) { - Coroutine::sleep(1); - var_dump(proc_get_status($this->source)['running']); - } - var_dump(proc_get_status($this->source)['running']); - proc_close($this->source); - var_dump('isClose.'); - $this->source = null; - } - } + /** + * @throws Exception + */ + public function onExit() + { + $data = Coroutine::waitSignal(SIGTERM | SIGKILL, -1); + if ($data) { + $pid = file_get_contents(storage('.swoole.pid')); + if (!empty($pid) && Process::kill($pid, 0)) { + Process::kill($pid, SIGTERM); + } + $this->stop(); + $this->source = NULL; + } + } - /** - * @param $code - * @param $message - * @param $file - * @param $line - * @throws Exception - */ - public function onErrorHandler($code, $message, $file, $line) - { - if (str_contains($message, 'The file descriptor is not an inotify instance')) { - return; - } - debug('Error:' . $message . ' at ' . $file . ':' . $line); - } + /** + * @throws Exception + */ + private function stop(): void + { + if (is_resource($this->source)) { + proc_terminate($this->source); + while (proc_get_status($this->source)['running']) { + Coroutine::sleep(1); + var_dump(proc_get_status($this->source)['running']); + } + var_dump(proc_get_status($this->source)['running']); + proc_close($this->source); + var_dump('isClose.'); + $this->source = NULL; + } + } - /** - * 重启 - * - * @throws Exception - */ - public function trigger_reload() - { - Kiri::getDi()->get(Logger::class)->warning('change reload'); - if ($this->process instanceof Process && Process::kill($this->process->pid, 0)) { - $pid = file_get_contents(storage('.swoole.pid')); - if (!empty($pid) && Process::kill($pid, 0)) { - Process::kill($pid, SIGTERM); - } - Process::kill($this->process->pid, SIGTERM); - Process::wait(true); - } - $this->process = new Process(function (Process $process) { - $process->exec(PHP_BINARY, [APP_PATH . "kiri.php", "sw:server", "restart"]); - }); - $this->process->start(); - } + /** + * @param $code + * @param $message + * @param $file + * @param $line + * @throws Exception + */ + public function onErrorHandler($code, $message, $file, $line) + { + if (str_contains($message, 'The file descriptor is not an inotify instance')) { + return; + } + debug('Error:' . $message . ' at ' . $file . ':' . $line); + } + + + /** + * 重启 + * + * @throws Exception + */ + public function trigger_reload() + { + Kiri::getDi()->get(Logger::class)->warning('change reload'); + if ($this->process instanceof Process && Process::kill($this->process->pid, 0)) { + $pid = file_get_contents(storage('.swoole.pid')); + if (!empty($pid) && Process::kill($pid, 0)) { + Process::kill($pid, SIGTERM); + } + Process::kill($this->process->pid, SIGTERM); + Process::wait(TRUE); + } + $this->process = new Process(function (Process $process) { + $process->exec(PHP_BINARY, [APP_PATH . "kiri.php", "sw:server", "restart"]); + }); + $this->process->start(); + } }