我有以下案例:
所以在 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核心缓存功能实现这一目标?
如果你真的想用这么多标签来标记一个列表视图(我不建议这样做,见下文),你可以在 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不调用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());
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)
| 归档时间: |
|
| 查看次数: |
762 次 |
| 最近记录: |