addCache($cron_file, $filename, $fileMtime); } // 任务缓存判断 if (self::$cron_cache[$filename]['fileMtime'] === $fileMtime) { // 命中缓存 } else { // 未命中缓存 echo $cron_file.'修改时间:'.date('Y-m-d H:i:s', $fileMtime).PHP_EOL; // 清理定时器 $this->clearTimer($filename); $this->addCache($cron_file, $filename, $fileMtime); } } //清理计划任务缓存 $this->clearCache(); //cli(self::$cron_cache); } /** * 创建计划任务缓存 * @param string $cron_file * @param string $filename * @param int $fileMtime * @return array */ public function addCache(string $cron_file, string $filename, int $fileMtime):array { $cron = Conf::get($cron_file, Constant::config_format, [], true); self::$cron_cache[$filename] = $cron; self::$cron_cache[$filename]['fileMtime'] = $fileMtime; // 添加定时器 $this->addTimer($cron, $filename); return $cron; } /** * 清理计划任务缓存 */ public function clearCache() { clearstatcache(); foreach (self::$cron_cache as $filename => $cron) { $cron_file = self::$cron_dir . DIRECTORY_SEPARATOR . $filename; if (!is_file($cron_file)) { unset(self::$cron_cache[$filename]); // 清理定时器 $this->clearTimer($filename); } } } /** * 添加定时器 * @param array $cron * @param string $filename */ public function addTimer(array $cron, string $filename) { new Crontab($cron['crontab'], function () use ($cron) { domainCron::execute($cron['command'], $cron['uuid']); }, $filename); } /** * 清理定时器 * @param string $filename */ public function clearTimer(string $filename = '') { $_instances = Crontab::getAll(); // Crontab对象数组 /** @var Crontab $crontab */ foreach ($_instances as $id => $crontab) { $name = $crontab->getName(); // 关键条件 if (is_string($name) && ($name === $filename)) { $crontab->remove($id); //移除定时器 return; } } } }