Cachearium\CacheAbstract::recursiveStart PHP 메소드

recursiveStart() 공개 메소드

public recursiveStart ( CacheKey $k, integer $lifetime = null, boolean $print = true, boolean $fail = false ) : string
$k CacheKey
$lifetime integer if null uses the class default
$print boolean
$fail boolean if true throws a NotCachedException if not cached.
리턴 string The cached item as a string or false if not cached.
    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;
    }