public function recursiveStart(CacheKey $k, $lifetime = null, $print = true, $fail = false)
{
// @codeCoverageIgnoreStart
if (!$this->enabled) {
return false;
}
// @codeCoverageIgnoreEnd
foreach ($this->loopdata as $l) {
/* @var $l CacheData */
if ($l->checkClash($k)) {
throw new Exceptions\CacheKeyClashException();
}
}
// check if we are inside another cache for automatic dependencies.
/* @var $cachedata CacheData */
$cachedata = null;
try {
$cachedata = $this->getData($k);
if (!$cachedata->checkUpdateToDate($this)) {
// stale
$cachedata = null;
}
// TODO $this->prefetch($cachedata->getDependencies());
} catch (Exceptions\NotCachedException $e) {
}
// found. just return it.
if ($cachedata) {
try {
$this->log(CacheLogEnum::ACCESSED, $cachedata->key, $cachedata->lifetime);
$key = "cache-" . rand();
$retval = $cachedata->stringify($this);
if ($print) {
// @codeCoverageIgnoreStart
if (static::$debugOnPage) {
$this->printProbeStart($key, $cachedata, 'hit');
}
// @codeCoverageIgnoreEnd
echo $retval;
// @codeCoverageIgnoreStart
if (static::$debugOnPage) {
$this->printProbeEnd($key, $cachedata);
}
// @codeCoverageIgnoreEnd
}
return $retval;
} catch (Exceptions\NotCachedException $e) {
$this->delete($k);
// clear recursively
if ($this->inloop) {
throw $e;
}
}
}
if ($fail) {
throw new Exceptions\NotCachedException();
}
$this->inloop++;
$cd = new CacheData($k);
$cd->setLifetime($lifetime ? $lifetime : $this->lifetime);
$this->loopdata[$this->inloop] = $cd;
if ($this->inloop > 1) {
// we are recursive. push whatever we have so far in the previous cache
$data = ob_get_contents();
ob_clean();
foreach ($this->loopdata as $l) {
if ($l == $cd) {
// don't depend on itself
continue;
}
/* @var $l CacheData */
$l->addDependency($k);
}
$this->loopdata[$this->inloop - 1]->appendData($data);
$this->loopdata[$this->inloop - 1]->appendRecursionData($cd);
} else {
// something was not cached below. We invalidated all cache
// dependencies
}
ob_start();
ob_implicit_flush(false);
return false;
}