gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:12:11 25 4
gpt4 key购买 nike

我有以下案例:

  1. 记录会在单个 View (showAction) 和带分页的 ListView (listAction) 以及其他一些操作中显示。
  2. 我想从调度程序中刷新给定单个记录的缓存 - 在单个 View 和 ListView 上 - 仅适用于适当的页面。

所以在showAction中有:

   public function showAction(...) {
...
$this->addCacheTags('RecordName_' . $item->getUid());
...

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

$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());

这对于 singleView 来说效果很好,但对于需要标记多个记录的操作则不起作用,因为在我的情况下,listAction 中的后续操作将无法按预期工作(每个请求只能添加一个标签):

   foreach($products as $product){
$this->addCacheTags('RecordName_' . $product->getUid());
}

有人知道如何使用 TYPO3 核心缓存功能来实现这一点吗?

最佳答案

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

$GLOBALS['TSFE']->addCacheTags(['RecordName_1', 'RecordName_2', 'RecordName_3']);

使用记录 uid 标记 ListView 的缺点是,您仍然需要另一个缓存标记来正确缓存清除新记录的 ListView (因为新 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']);

现在,在您的调度程序命令中,您需要清除更多缓存标签。您可以使用 flushCachesInGroupByTag 不为 cache_pagescache_pagesection 隐式调用 flushByTags 并支持添加自定义页面缓存的扩展例如 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

关于TYPO3 - 缓存标记和刷新 - 每个请求有多个标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41358897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com