/** * Check for cached evaluation and or collect metadata for evaluation * * 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). * * @param array $evaluateContext The current evaluation context * @param object $tsObject The current TypoScript object (for "this" in evaluations) * @return 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, $unserializedContext) use($self) { if (strpos($command, 'eval=') === 0) { $path = substr($command, 5); $result = $self->evaluateUncached($path, $unserializedContext); return $result; } else { throw new Exception(sprintf('Unknown uncached command "%s"', $command), 1392837596); } }, $evaluateContext['typoScriptPath'], $evaluateContext['cacheIdentifierValues'], $this->addCacheSegmentMarkersToPlaceholders); if ($segment !== FALSE) { return array(TRUE, $segment); } else { $this->addCacheSegmentMarkersToPlaceholders = TRUE; } $this->cacheMetadata[] = array('lifetime' => NULL); } if (isset($evaluateContext['configuration']['maximumLifetime'])) { $maximumLifetime = $this->runtime->evaluate($evaluateContext['typoScriptPath'] . '/__meta/cache/maximumLifetime', $tsObject); if ($maximumLifetime !== NULL && $this->cacheMetadata !== array()) { $cacheMetadata =& $this->cacheMetadata[count($this->cacheMetadata) - 1]; $cacheMetadata['lifetime'] = $cacheMetadata['lifetime'] !== NULL ? min($cacheMetadata['lifetime'], $maximumLifetime) : $maximumLifetime; } } } return array(FALSE, NULL); }
/** * Check for cached evaluation and or collect metadata for evaluation * * 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). * * @param array $evaluateContext The current evaluation context * @param object $tsObject The current TypoScript object (for "this" in evaluations) * @return 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]; }