setName('dmtask') ->setDescription('容灾切换任务'); } protected function execute(Input $input, Output $output) { $res = Db::name('config')->cache('configs', 0)->column('value', 'key'); Config::set($res, 'sys'); config_set('run_error', ''); if (!extension_loaded('swoole')) { $output->writeln('[Error] 未安装Swoole扩展'); config_set('run_error', '未安装Swoole扩展'); return; } try { $output->writeln('进程启动成功.'); $this->runtask(); } catch (Exception $e) { $output->writeln('[Error] ' . $e->getMessage()); config_set('run_error', $e->getMessage()); } } private function runtask() { \Co::set(['hook_flags' => SWOOLE_HOOK_ALL]); \Co\run(function () { $date = date("Ymd"); $count = config_get('run_count', null, true) ?? 0; while (true) { sleep(1); if ($date != date("Ymd")) { $count = 0; $date = date("Ymd"); } $rows = Db::name('dmtask')->where('checknexttime', '<=', time())->where('active', 1)->order('id', 'ASC')->select(); foreach ($rows as $row) { \go(function () use ($row) { try { (new TaskRunner())->execute($row); } catch (\Swoole\ExitException $e) { echo $e->getStatus() . "\n"; } catch (Exception $e) { echo $e->__toString() . "\n"; } }); Db::name('dmtask')->where('id', $row['id'])->update([ 'checktime' => time(), 'checknexttime' => time() + $row['frequency'] ]); $count++; } config_set('run_time', date("Y-m-d H:i:s")); config_set('run_count', $count); } }); } }