setName('timer') ->addArgument('status', Argument::REQUIRED, 'start/stop/reload/status/connections') ->addOption('d', null, Option::VALUE_NONE, 'daemon(守护进程)方式启动') ->addOption('i', null, Option::VALUE_OPTIONAL, '多长时间执行一次,可以精确到0.001') ->setDescription('start/stop/restart 定时任务'); } protected function init(Input $input, Output $output) { global $argv; if ($input->hasOption('i')) $this->interval = floatval($input->getOption('i')); $argv[1] = $input->getArgument('status') ?: 'start'; if ($input->hasOption('d')) { $argv[2] = '-d'; } else { unset($argv[2]); } } protected function execute(Input $input, Output $output) { $this->init($input, $output); Worker::$pidFile = app()->getRootPath() . 'timer.pid'; $task = new Worker(); $task->count = 1; event('Task_6'); $task->onWorkerStart = [$this, 'start']; $task->runAll(); } public function stop() { \Workerman\Lib\Timer::del($this->timer); } public function start() { $last = time(); $task = [6 => $last, 10 => $last, 30 => $last, 60 => $last, 180 => $last, 300 => $last, 7200 => $last]; $this->timer = \Workerman\Lib\Timer::add($this->interval, function () use (&$task) { try { $now = time(); event('Task_2'); foreach ($task as $sec => $time) { if ($now - $time >= $sec) { event('Task_' . $sec); $task[$sec] = $now; } } } catch (\Throwable $e) { } }); } }