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