Neos\Fusion\Core\Cache\RuntimeContentCache::preEvaluate PHP 메소드

preEvaluate() 공개 메소드

Try to get a cached segment for the current path and return that with all uncached segments evaluated if it exists. Otherwise metadata for the cache lifetime is collected (if configured) for nested evaluations (to find the minimum maximumLifetime).
public preEvaluate ( array &$evaluateContext, object $tsObject ) : array
$evaluateContext array The current evaluation context
$tsObject object The current TypoScript object (for "this" in evaluations)
리턴 array Cache hit state as boolean and value as mixed
    public function preEvaluate(array &$evaluateContext, $tsObject)
    {
        if ($this->enableContentCache) {
            if ($evaluateContext['cacheForPathEnabled']) {
                $evaluateContext['cacheIdentifierValues'] = $this->buildCacheIdentifierValues($evaluateContext['configuration'], $evaluateContext['typoScriptPath'], $tsObject);
                $self = $this;
                $segment = $this->contentCache->getCachedSegment(function ($command, $additionalData, $cache) use($self, $evaluateContext, $tsObject) {
                    if (strpos($command, 'eval=') === 0) {
                        $unserializedContext = $self->unserializeContext($additionalData['context']);
                        $path = substr($command, 5);
                        $result = $self->evaluateUncached($path, $unserializedContext);
                        return $result;
                    } elseif (strpos($command, 'evalCached=') === 0) {
                        $identifier = substr($command, 11);
                        $cacheDiscriminator = $this->runtime->evaluate($additionalData['path'] . '/__meta/cache/entryDiscriminator');
                        $cacheIdentifier = substr($identifier, 0, strpos($identifier, '_')) . '_' . md5($cacheDiscriminator);
                        $result = $cache->get($cacheIdentifier);
                        if ($result === false) {
                            $unserializedContext = $self->unserializeContext($additionalData['context']);
                            $maximumLifetime = null;
                            if (isset($evaluateContext['configuration']['maximumLifetime'])) {
                                $maximumLifetime = $this->runtime->evaluate($evaluateContext['typoScriptPath'] . '/__meta/cache/maximumLifetime', $tsObject);
                            }
                            $cacheTags = $this->buildCacheTags($evaluateContext['configuration'], $evaluateContext['typoScriptPath'], $tsObject);
                            $result = $self->evaluateUncached($additionalData['path'], $unserializedContext);
                            $cache->set($cacheIdentifier, $result, $cacheTags, $maximumLifetime);
                        }
                        return $result;
                    } else {
                        throw new Exception(sprintf('Unknown uncached command "%s"', $command), 1392837596);
                    }
                }, $evaluateContext['typoScriptPath'], $evaluateContext['cacheIdentifierValues'], $this->addCacheSegmentMarkersToPlaceholders);
                if ($segment !== false) {
                    return [true, $segment];
                } else {
                    $this->addCacheSegmentMarkersToPlaceholders = true;
                }
                $this->cacheMetadata[] = ['lifetime' => null];
            }
            if ($evaluateContext['cacheForPathEnabled'] && $evaluateContext['cacheForPathDisabled']) {
                $evaluateContext['cacheDiscriminator'] = $this->runtime->evaluate($evaluateContext['typoScriptPath'] . '/__meta/cache/entryDiscriminator');
            }
            if (isset($evaluateContext['configuration']['maximumLifetime'])) {
                $maximumLifetime = $this->runtime->evaluate($evaluateContext['typoScriptPath'] . '/__meta/cache/maximumLifetime', $tsObject);
                if ($maximumLifetime !== null && $this->cacheMetadata !== []) {
                    $cacheMetadata =& $this->cacheMetadata[count($this->cacheMetadata) - 1];
                    $cacheMetadata['lifetime'] = $cacheMetadata['lifetime'] !== null ? min($cacheMetadata['lifetime'], $maximumLifetime) : $maximumLifetime;
                }
            }
        }
        return [false, null];
    }

Usage Example

예제 #1
0
 /**
  * Does the evaluation of a TypoScript instance, first checking the cache and if conditions and afterwards applying processors.
  *
  * @param AbstractTypoScriptObject $typoScriptObject
  * @param string $typoScriptPath
  * @param array $typoScriptConfiguration
  * @param array $cacheContext
  * @return mixed
  */
 protected function evaluateObjectOrRetrieveFromCache($typoScriptObject, $typoScriptPath, $typoScriptConfiguration, $cacheContext)
 {
     $output = null;
     $evaluationStatus = self::EVALUATION_SKIPPED;
     list($cacheHit, $cachedResult) = $this->runtimeContentCache->preEvaluate($cacheContext, $typoScriptObject);
     if ($cacheHit) {
         return $cachedResult;
     }
     $evaluateObject = true;
     if ($this->evaluateIfCondition($typoScriptConfiguration, $typoScriptPath, $typoScriptObject) === false) {
         $evaluateObject = false;
     }
     if ($evaluateObject) {
         $output = $typoScriptObject->evaluate();
         $evaluationStatus = self::EVALUATION_EXECUTED;
     }
     $this->lastEvaluationStatus = $evaluationStatus;
     if ($evaluateObject) {
         $output = $this->evaluateProcessors($output, $typoScriptConfiguration, $typoScriptPath, $typoScriptObject);
     }
     $output = $this->runtimeContentCache->postProcess($cacheContext, $typoScriptObject, $output);
     return $output;
 }