Chris@13: cacheFile = $cacheFile; Chris@13: $this->interval = $interval; Chris@13: } Chris@13: Chris@13: public function fetchLatestRelease() Chris@13: { Chris@13: // Read the cached file Chris@17: $cached = \json_decode(@\file_get_contents($this->cacheFile, false)); Chris@13: if ($cached && isset($cached->last_check) && isset($cached->release)) { Chris@13: $now = new \DateTime(); Chris@13: $lastCheck = new \DateTime($cached->last_check); Chris@13: if ($lastCheck >= $now->sub($this->getDateInterval())) { Chris@13: return $cached->release; Chris@13: } Chris@13: } Chris@13: Chris@13: // Fall back to fetching from GitHub Chris@13: $release = parent::fetchLatestRelease(); Chris@13: if ($release && isset($release->tag_name)) { Chris@13: $this->updateCache($release); Chris@13: } Chris@13: Chris@13: return $release; Chris@13: } Chris@13: Chris@13: private function getDateInterval() Chris@13: { Chris@13: switch ($this->interval) { Chris@13: case Checker::DAILY: Chris@13: return new \DateInterval('P1D'); Chris@13: case Checker::WEEKLY: Chris@13: return new \DateInterval('P1W'); Chris@13: case Checker::MONTHLY: Chris@13: return new \DateInterval('P1M'); Chris@13: } Chris@13: } Chris@13: Chris@13: private function updateCache($release) Chris@13: { Chris@13: $data = [ Chris@17: 'last_check' => \date(DATE_ATOM), Chris@13: 'release' => $release, Chris@13: ]; Chris@13: Chris@17: \file_put_contents($this->cacheFile, \json_encode($data)); Chris@13: } Chris@13: }