/** * Cache content * * Returns feedParser object from cache if present or write it to cache and * returns result. * * @param string $url Feed URL * @return feedParser */ protected function withCache($url) { $url_md5 = md5($url); $cached_file = sprintf('%s/%s/%s/%s/%s.php', $this->cache_dir, $this->cache_file_prefix, substr($url_md5, 0, 2), substr($url_md5, 2, 2), $url_md5); $may_use_cached = false; if (@file_exists($cached_file)) { $may_use_cached = true; $ts = @filemtime($cached_file); if ($ts > strtotime($this->cache_ttl)) { # Direct cache return unserialize(file_get_contents($cached_file)); } $this->setValidator('IfModifiedSince', $ts); } if (!$this->getFeed($url)) { if ($may_use_cached) { # connection failed - fetched from cache return unserialize(file_get_contents($cached_file)); } return false; } switch ($this->getStatus()) { case '304': @files::touch($cached_file); return unserialize(file_get_contents($cached_file)); case '200': if ($feed = new feedParser($this->getContent())) { try { files::makeDir(dirname($cached_file), true); } catch (Exception $e) { return $feed; } if ($fp = @fopen($cached_file, 'wb')) { fwrite($fp, serialize($feed)); fclose($fp); files::inheritChmod($cached_file); } return $feed; } } return false; }
/** * Get repository modules list using cache. * * @param string $url XML feed URL * @return array Feed content or False on fail */ protected function withCache($url) { $url_md5 = md5($url); $cached_file = sprintf('%s/%s/%s/%s/%s.ser', $this->cache_dir, $this->cache_file_prefix, substr($url_md5, 0, 2), substr($url_md5, 2, 2), $url_md5); $may_use_cached = false; # Use cache file ? if (@file_exists($cached_file) && !$this->force) { $may_use_cached = true; $ts = @filemtime($cached_file); if ($ts > strtotime($this->cache_ttl)) { # Direct cache return unserialize(file_get_contents($cached_file)); } $this->setValidator('IfModifiedSince', $ts); } # Query repository if (!$this->getModulesXML($url)) { if ($may_use_cached) { # Touch cache TTL even if query failed ? if ($this->cache_touch_on_fail) { @files::touch($cached_file); } # Connection failed - fetched from cache return unserialize(file_get_contents($cached_file)); } return false; } # Parse response switch ($this->getStatus()) { # Not modified, use cache case '304': @files::touch($cached_file); return unserialize(file_get_contents($cached_file)); # Ok, parse feed # Ok, parse feed case '200': if ($modules = new dcStoreParser($this->getContent())) { try { files::makeDir(dirname($cached_file), true); } catch (Exception $e) { return $modules; } if ($fp = @fopen($cached_file, 'wb')) { fwrite($fp, serialize($modules)); fclose($fp); files::inheritChmod($cached_file); } return $modules; } } return false; }