如何将数据处理器的最大缓存时长传递给FLUIDTEMPLATE以调整缓存?
解决方案
方法1:数据处理器直接修改页面缓存配置
不需要把缓存时长传递给FLUIDTEMPLATE,可在数据处理器中直接调整当前页面的缓存超时时间,让页面缓存到指定时间后自动刷新,重新执行处理器生成对应时段的壁纸列表。
在自定义数据处理器类中添加如下逻辑:
public function process(ProcessingInstruction $processingInstruction, ProcessorInterface $processor) { // 生成目标图片列表 $imageList = $this->generateTimeBasedImageList(); // 计算到下一个时段切换点的剩余秒数(比如当前离下一个时段还有30分钟,返回1800) $cacheTimeout = $this->calculateTimeToNextSwitch(); // 获取当前页面的缓存配置并修改超时时间 $page = $processingInstruction->getContext()->getProperty('page'); $cacheConfig = $page->getCacheConfiguration(); $cacheConfig['cache_timeout'] = $cacheTimeout; $page->setCacheConfiguration($cacheConfig); // 返回图片列表给Fluid模板渲染 return [ 'imageList' => $imageList ]; }
方法2:动态设置FLUIDTEMPLATE自身缓存时长
如果需要单独控制模板片段的缓存(而非整个页面),可让数据处理器返回缓存时长,再通过TypoScript动态覆盖FLUIDTEMPLATE的缓存配置。
- 数据处理器返回缓存时长:
public function process(ProcessingInstruction $processingInstruction, ProcessorInterface $processor) { $imageList = $this->generateTimeBasedImageList(); $cacheDuration = $this->calculateTimeToNextSwitch(); return [ 'imageList' => $imageList, 'cacheDuration' => $cacheDuration ]; }
- 在TypoScript中读取该值并设置模板缓存:
page.10 = FLUIDTEMPLATE page.10 { templateName = WallpaperTemplate dataProcessing { 10 = Your\Extension\DataProcessing\WallpaperProcessor } cache { // 从数据处理器结果中读取缓存时长 duration.cObject = TEXT duration.cObject.data = processedData:cacheDuration duration.cObject.intval = 1 } }
核心注意事项
- 缓存时长建议设为到下一个时段切换点的剩余秒数,而非固定时长,确保缓存刚好在时段切换时失效,既保证内容准确又避免频繁刷新影响性能。
- 若使用页面级缓存,需确保服务器时间同步,避免计算的切换时间出现偏差。
内容的提问来源于stack exchange,提问作者Dr. Dieter Porth
相关产品推荐
相关产品推荐

