我有以下案例:
所以在showAction中有:
AA
然后在Scheduler中我可以使用类似的东西来删除缓存:
public function showAction(...) {
...
$this->addCacheTags('RecordName_' . $item->getUid());
...
这适用于singleView,但不能用于标记多个记录的操作,因为listAction中的后续操作在我的情况下不能正常工作(每个请求只能添加一个标记):
$this->cacheManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Cache\\CacheManager');
$this->cacheManager->getCache('cache_pages')->flushByTag('RecordName_' . $item->getUid());
$this->cacheManager->getCache('cache_pagesection')->flushByTag('RecordName_' . $item->getUid());
任何人都有解决方案如何使用TYPO3核心缓存功能实现这一目标?
答案 0 :(得分:3)
如果你真的想要用很多标签标记列表视图(我不建议,见下文),你可以在TYPO3中为每个请求添加多个标签:
$GLOBALS['TSFE']->addCacheTags(['RecordName_1', 'RecordName_2', 'RecordName_3']);
使用记录uid标记列表视图的缺点是,您仍然需要另一个缓存标记来正确缓存清除新记录的列表视图(因为新uid的标记具有尚未添加到缓存标记中)。 因此,最好添加描述当前搜索查询的标记(每个请求也只适合您的标记#34;要求)
// list view for records stored in pid 10
$GLOBALS['TSFE']->addCacheTags(['RecordName_pid_10']);
// list view by category with uid 30
$GLOBALS['TSFE']->addCacheTags(['RecordName_category_30']);
// single view for uid 1
$GLOBALS['TSFE']->addCacheTags(['RecordName_1']);
现在,在scheduler命令中,您需要清除更多缓存标记。您可以使用flushCachesInGroupByTag
来隐式调用flushByTags
cache_pages
和cache_pagesection
并且支持添加自定义页面缓存的扩展名,例如EXT:nc_staticfilecache或EXT:nginx_cache。
$this->cacheManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Cache\\CacheManager');
$this->cacheManager->flushCachesInGroupByTag('pages', 'RecordName_' . $item->getUid());
$this->cacheManager->flushCachesInGroupByTag('pages', 'RecordName_pid_' . $item->getPid());
注意:如果您已经使用TYPO3 8.5,则可以使用flushByTags(array)
/ flushCachesInGroupByTag(array)
一次刷新每个缓存的多个标记。 [1]
$this->cacheManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Cache\\CacheManager');
$this->cacheManager->flushCachesInGroupByTags('pages', ['RecordName_' . $item->getUid(), 'RecordName_pid_' . $item->getPid()]);
答案 1 :(得分:0)
我将使用ViewHelper创建标记,然后在List视图中调用