2016-12-28 37 views
1

多個標籤我有以下情況:TYPO3 - 緩存標記和沖洗 - 每個請求

  1. 記錄都與分頁(的listAction)單(的showAction)和列表視圖和其他一些行動也顯示。
  2. 我想從內部調度刷新緩存對於給定的一個記錄 - 無論在單一視圖和列表視圖 - 只有相應頁面。

所以的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以下將無法正常工作(每個請求只有一個標籤可以addedd):

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

任何人有解決方案如何實現與使用TYPO3核心的緩存功能?

回答

0

我會用一個視圖助手,然後將其稱爲列表視圖中創建標籤

+0

嗯,我不明白你的意思 - 你再怎麼刪除同時在顯示這個項目的所有意見(單,清單等)緩存可以只添加一個標籤的看法? –

2

如果你真的要標記有這麼多的標籤列表視圖(我不建議,見下文),你可以在TYPO3添加每個請求多個標籤:

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

標記與記錄UID的列表視圖的缺點是,你還是會需要另一個高速緩存標記正確緩存清晰的新記錄列表視圖(如新的UID標籤還沒有被添加到高速緩存標記)。 因此最好是添加描述當前的搜索查詢標籤(也which'd滿足您的要求「只有一個每次請求標籤」):

// 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不調用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()); 

注意:如果你已經在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