addArgument('host', InputArgument::REQUIRED) ->addOption('timeout', mode: InputOption::VALUE_REQUIRED, description: 'Timeout in milliseconds.', default: self::DEFAULT_TIMEOUT_MS) ->addOption('interval', mode: InputOption::VALUE_REQUIRED, description: 'Interval in milliseconds.', default: self::DEFAULT_INTERVAL_MS) ; } protected function execute(InputInterface $input, OutputInterface $output): int { $host = $input->getArgument('host'); \assert($host !== ''); $timeoutMs = (int) $input->getOption('timeout'); \assert($timeoutMs > 0); $intervalUs = (int) $input->getOption('interval') * 1000; \assert($intervalUs > 0); $till = new \DateTimeImmutable(sprintf('+%d milliseconds', $timeoutMs)); $printedWait = false; do { if (@fsockopen($host)) { $output->success(sprintf('%s is up', $host)); return self::SUCCESS; } if (!$printedWait) { $output->comment(sprintf('Waiting for %s...', $host)); $printedWait = true; } usleep($intervalUs); } while (new \DateTimeImmutable() < $till); $output->error(sprintf('Failed to connect to %s in %d ms.', $host, $timeoutMs)); return self::FAILURE; } }