/** * Evaluates the result of the given callback * * @param string $key Unique key for this * @param callable $callback Callback for evaluating the content * @return mixed Result of $callback() */ public function getContent($key, $callback) { if ($this->nestedContentFilter) { return $this->nestedContentFilter->getContent($key, $callback); } else { return call_user_func($callback); } }
public function getContent($key, $callback) { $cache = $this->getCache(); // Return cached value if available $cacheEnabled = \Config::inst()->get(get_class(), 'cache_enabled'); $result = isset($_GET['flush']) || !$cacheEnabled ? null : $cache->load($key); if ($result) { return $result; } // Fallback to generate result $result = parent::getContent($key, $callback); $cache->save($result, $key); return $result; }
public function getContent($key, $callback) { // Bypass rate limiting if flushing, or timeout isn't set $timeout = \Config::inst()->get(get_class(), 'lock_timeout'); if (isset($_GET['flush']) || !$timeout) { return parent::getContent($key, $callback); } // Generate result with rate limiting enabled $limitKey = $this->getCacheKey($key); $cache = $this->getCache(); if ($lockedUntil = $cache->load($limitKey)) { if (time() < $lockedUntil) { // Politely inform visitor of limit $response = new \SS_HTTPResponse_Exception('Too Many Requests.', 429); $response->getResponse()->addHeader('Retry-After', 1 + $lockedUntil - time()); throw $response; } } // Apply rate limit $cache->save(time() + $timeout, $limitKey); // Generate results $result = parent::getContent($key, $callback); // Reset rate limit with optional cooldown if ($cooldown = \Config::inst()->get(get_class(), 'lock_cooldown')) { // Set cooldown on successful query execution $cache->save(time() + $cooldown, $limitKey); } else { // Without cooldown simply disable lock $cache->remove($limitKey); } return $result; }