TYPO3 - 缓存标记和刷新 - 每个请求多个标记

时间:2016-12-28 09:18:21

标签: typo3

我有以下案例:

  1. 记录显示在单个(showAction)和列表视图中,并带有分页(listAction)以及其他一些操作。
  2. 我想在Scheduler中为给定的单个记录刷新缓存 - 在单个视图和列表视图上 - 只有适当的页面。
  3. 所以在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核心缓存功能实现这一目标?

2 个答案:

答案 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_pagescache_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] https://git.typo3.org/Packages/TYPO3.CMS.git/commitdiff/b8621ebfe2b65826d25e80519209e5420df436a8?hp=e664996d6eb096555496774658093bf220566933

答案 1 :(得分:0)

我将使用ViewHelper创建标记,然后在List视图中调用