setName('crontab') ->addArgument('action', Argument::OPTIONAL, 'action') ->addOption('daemon', 'd', Option::VALUE_NONE, 'daemon mode') ->addOption('grace', 'g', Option::VALUE_NONE, 'graceful shutdown') ->setDescription('Crontab command'); } protected function execute(Input $input, Output $output): void { $argv = [$input->getArgument('action')]; $daemon = $input->getOption('daemon'); if ($daemon) { $argv[] = '-d'; } $grace = $input->getOption('grace'); if ($grace) { $argv[] = '-g'; } $worker = new class ($argv, $this->app) extends Worker { private static array $argv; public function __construct(array $argv, private readonly App $app, ?string $socketName = null, array $socketContext = []) { parent::__construct($socketName, $socketContext); self::$argv = $argv; self::$pidFile = $app->getRootPath() . 'runtime/crontab.pid'; self::$logFile = $app->getRootPath() . 'runtime/log/' . date('Ymd') . '_crontab.log'; self::$statisticsFile = $app->getRootPath() . 'runtime/crontab_statistics.php'; } public function setOnWorkerStart(callable $worker): void { $this->onWorkerStart = $worker; } public static function getArgv(): array { return self::$argv; } }; $worker->setOnWorkerStart(function () { Event::trigger(CrontabWorkerStartEvent::class); }); Worker::runAll(); } }