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

mcy*_*cyg 1 typo3

我有以下案例:

  1. 记录显示在单个 (showAction) 和带分页的列表视图 (listAction) 中,也显示在其他一些操作中。
  2. 我想从调度程序中为给定的单个记录刷新缓存 - 在单个视图和列表视图中 - 仅适用于合适的页面。

所以在 showAction 中有:

   public function showAction(...) {
   ...
        $this->addCacheTags('RecordName_' . $item->getUid());
   ...
Run Code Online (Sandbox Code Playgroud)

然后在调度程序中我可以使用类似的东西来删除缓存:

$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());
Run Code Online (Sandbox Code Playgroud)

这将适用于 singleView 但不适用于需要标记多个记录的操作,因为在我的情况下,listAction 中的以下内容将无法正常工作(每个请求只能添加一个标签):

   foreach($products as $product){
            $this->addCacheTags('RecordName_' . $product->getUid());
        }
Run Code Online (Sandbox Code Playgroud)

任何人都有解决方案如何使用TYPO3核心缓存功能实现这一目标?

Ben*_*zke 5

如果你真的想用这么多标签来标记一个列表视图(我不建议这样做,见下文),你可以在 TYPO3 中为每个请求添加多个标签:

$GLOBALS['TSFE']->addCacheTags(['RecordName_1', 'RecordName_2', 'RecordName_3']);
Run Code Online (Sandbox Code Playgroud)

使用记录 uid 标记列表视图的缺点是,您仍然需要另一个缓存标记来正确缓存清除新记录的列表视图(因为新 uid 的标记尚未添加到缓存标记中) . 因此,最好添加描述当前搜索查询的标签(这也符合“每个请求只有一个标签”的要求):

// 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']);
Run Code Online (Sandbox Code Playgroud)

现在在您的调度程序命令中,您需要清除更多缓存标签。您可以使用flushCachesInGroupByTag不调用flushByTagscache_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());
Run Code Online (Sandbox Code Playgroud)

注意:如果您已经在 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()]);
Run Code Online (Sandbox Code Playgroud)

[1] https://git.typo3.org/Packages/TYPO3.CMS.git/commitdiff/b8621ebfe2b65826d25e80519209e5420df436a8?hp=e664996d6eb0965554967746580936f9