Esempio n. 1
0
 /**
  * 取得当前时间需要执行的一个 Cron Task,注意这里是 load 方法,所以返回的结果是可以做 CRUD 操作的s
  *
  * @param int $currentTime 当前时间
  *
  * @return \Core\Service\Cron\DataMapper|null
  */
 public static function loadNextUnRunCronTask($currentTime)
 {
     $cronTaskInfo = ShareCache::get(self::getCronTaskCacheKey());
     // 缓存表明目前没有任务,所以我们也就没必要再去查询数据库了
     if (self::$cronTaskNoTaskMagic === $cronTaskInfo) {
         return null;
     }
     // 当前任务还没到执行的时候
     if (is_array($cronTaskInfo) && $cronTaskInfo['task_time'] > $currentTime) {
         return null;
     }
     // 从数据库中取得任务
     $cronTaskService = new CronTaskService();
     $cronTask = $cronTaskService->loadNextUnRunCronTask($currentTime);
     // 数据库里面也没有任务,设置缓存为“无任务”就不用老去查找数据库了
     if ($cronTask->isEmpty()) {
         ShareCache::set(self::getCronTaskCacheKey(), self::$cronTaskNoTaskMagic, 3600);
         return null;
     }
     // 这个任务还没到执行的时间,放到缓存里面
     if ($cronTask->task_time > $currentTime) {
         ShareCache::set(self::getCronTaskCacheKey(), $cronTask->toArray(), 3600);
         return null;
     }
     // 清除缓存
     ShareCache::clear(self::getCronTaskCacheKey());
     // 返回需要执行的任务
     return $cronTask;
 }