get($name); if (isset($this->_process[$name->getName()])) { throw new Exception('AbstractProcess(' . $name->getName() . ') is exists.'); } $this->_process[$name->getName()] = $this->genProcess($name); } } /** * @param AbstractProcess $name * @return Process */ private function genProcess(AbstractProcess $name): Process { return new Process(function (Process $process) use ($name) { $process->name('[' . \config('site.id', 'system-service') . '].' . $name->getName() . '[' . $process->pid . ']'); $name->onShutdown($process)->process($process); }, $name->getRedirectStdinAndStdout(), $name->getPipeType(), $name->isEnableCoroutine()); } /** * @param string $name * @return AbstractProcess|null */ public function getProcess(string $name): ?Process { return $this->_process[$name] ?? null; } /** * @return array */ public function getProcesses(): array { return $this->_process; } /** * @return void */ private function terminateProcesses(): void { $pids = []; foreach ($this->_process as $process) { $pid = (int)($process->pid ?? 0); if ($pid > 1 && $pid !== getmypid()) { $pids[] = $pid; } } $pids = array_values(array_unique($pids)); foreach ($pids as $pid) { if (@Process::kill($pid, 0)) { @Process::kill($pid, SIGTERM); } } for ($i = 0; $i < 10; $i++) { $alive = array_values(array_filter($pids, static fn(int $pid): bool => @Process::kill($pid, 0))); if ($alive === []) { return; } usleep(100000); } foreach ($pids as $pid) { if (@Process::kill($pid, 0)) { @Process::kill($pid, SIGKILL); } } } }