<?php namespace app\task; use app\task\time\DemoTime; use think\Cache; use think\Console; /** * 定时任务管理器 * 业务代码执行时间过长,会造成堵塞,请合理安排执行任务 * Class Kernel * @package app\task * Author: Panda joeyoung0314@qq.com * Gitee: https://gitee.com/xertao */ class Kernel{ /** * 定时组 * 业务代码 业务代码执行时间过长,会造成堵塞,请合理安排执行任务。 * 过于复杂的业务需求建议搭配异步进行处理,定时任务作为触发功能使用。 * $this->command('DemoTime','10:08','at');// 每天指定时间点触发 * $this->command('DemoTime','1','minute');// 默认间隔1分钟触发 daily 单位分钟 * @return void */ public function schedule() { $this->command(DemoTime::class,'1','minute');// 默认间隔1分钟触发 daily 单位分钟 } /** * 定时任务触发时间 * @param $class * @param string $daily * @param string $type * @return false|\think\console\Output */ private function command($class,string $daily = '',string $type = 'minute') { // 按分钟、按每天指定点数 if (!in_array($type,['minute','at'])) { return false; } if (!empty($daily)) { switch ($type){ case 'minute': $run_time = Cache::get("task_{$class}_{$type}_{$daily}"); if (ceil((time() - $run_time) / 60) < $daily){ return false; } Cache::set("task_{$class}_{$type}_{$daily}",time()); break; case 'at': if (date('H:i') != $daily){ return false; } break; default: return false; } } return (new $class)->execute(); } }