首页 > 解决方案 > 使用自定义缓存后端时,通过 cli 执行的 TYPO3 调度程序任务不会清除页面缓存

问题描述

我正在使用 TYPO3 9.5.14,并且正在从外部数据库导入新闻。导入后,我想清除呈现新闻的页面的缓存。

我使用的是 apcu 缓存后端,所以不是 TYPO3 的标准数据库缓存后端。我为新闻导入创建了一个调度程序任务,这就是问题所在:

当我通过后端模块调用调度程序任务时,一切都很好。新闻被导入,页面缓存被清除。但是当 cronjob 通过 cli 调用调度程序任务时,会导入新闻但不会清除页面缓存。我错过了什么?

这是调度程序任务类:

class NewsUpdateTask extends \TYPO3\CMS\Scheduler\Task\AbstractTask
{   
    public function execute()
    {   
        //some code that does the import...

        $cacheManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Cache\CacheManager::class);
        $cacheManager->flushCachesInGroupByTags('pages', ['pageId_2']);

        return true;
    }      
}

apcu 缓存后端配置包含在 AdditionalConfiguration.php 中,如下所示:

include_once "MwCachingConfiguration.php";

看起来像这样:

<?php

if (!function_exists('mw_setCacheBackend')) {
    function mw_setCacheBackend($backendClassName, $cacheName, $lifetime = NULL)
    {
        $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$cacheName]['backend'] = $backendClassName;
        if (isset($lifetime))
        {
            $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$cacheName]['options'] = array("defaultLifetime" => $lifetime);
        } else {
            $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$cacheName]['options'] = array();
        }
    }
}

$mw_apcExtensionLoaded = extension_loaded('apc');
$mw_apcuExtensionLoaded = extension_loaded('apcu');
$mw_apcAvailable = $mw_apcExtensionLoaded || $mw_apcuExtensionLoaded;
$mw_apcEnabled = ini_get('apc.enabled') == TRUE;

if (PHP_SAPI !== 'cli' && TYPO3\CMS\Core\Utility\GeneralUtility::getApplicationContext() !== 'Development' && $mw_apcAvailable && $mw_apcEnabled) {
    $mw_backendClassName = $mw_apcExtensionLoaded ? 'TYPO3\\CMS\\Core\\Cache\\Backend\\ApcBackend'
        : 'TYPO3\\CMS\\Core\\Cache\\Backend\\ApcuBackend';
} else {
    $mw_backendClassName = 'TYPO3\\CMS\\Core\\Cache\\Backend\\FileBackend';
}

$version = TYPO3_version;

if (substr($version,0,2) === "10")
{
    mw_setCacheBackend($mw_backendClassName, 'hash');
    mw_setCacheBackend($mw_backendClassName, 'pages');
    mw_setCacheBackend($mw_backendClassName, 'pagesection', 2592000);
    mw_setCacheBackend($mw_backendClassName, 'rootline',2592000);
    mw_setCacheBackend($mw_backendClassName, 'imagesizes', 0);
    mw_setCacheBackend($mw_backendClassName, 'extbase', 0);
} elseif ($version[0] === "9") {
    mw_setCacheBackend($mw_backendClassName, 'cache_hash');
    mw_setCacheBackend($mw_backendClassName, 'cache_pages');
    mw_setCacheBackend($mw_backendClassName, 'cache_pagesection', 2592000);
    mw_setCacheBackend($mw_backendClassName, 'cache_rootline',2592000);
    mw_setCacheBackend($mw_backendClassName, 'cache_imagesizes', 0);
    mw_setCacheBackend($mw_backendClassName, 'extbase_reflection', 0);
    mw_setCacheBackend($mw_backendClassName, 'extbase_datamapfactory_datamap', 0);
} elseif ($version[0] === "8" || $version[0] === "6") {
    mw_setCacheBackend($mw_backendClassName, 'cache_hash');
    mw_setCacheBackend($mw_backendClassName, 'cache_pages');
    mw_setCacheBackend($mw_backendClassName, 'extbase_datamapfactory_datamap');
    mw_setCacheBackend($mw_backendClassName, 'cache_pagesection', 2592000);
    mw_setCacheBackend($mw_backendClassName, 'cache_rootline',2592000);
    mw_setCacheBackend($mw_backendClassName, 'cache_imagesizes', 0);
    mw_setCacheBackend($mw_backendClassName, 'extbase_object', 0);
    mw_setCacheBackend($mw_backendClassName, 'extbase_reflection', 0);
} elseif ($version[0] === "7") {
    mw_setCacheBackend($mw_backendClassName, 'cache_hash');
    mw_setCacheBackend($mw_backendClassName, 'cache_pages');
    mw_setCacheBackend($mw_backendClassName, 'extbase_datamapfactory_datamap');
    mw_setCacheBackend($mw_backendClassName, 'extbase_typo3dbbackend_queries');
    mw_setCacheBackend($mw_backendClassName, 'cache_pagesection', 2592000);
    mw_setCacheBackend($mw_backendClassName, 'cache_rootline',2592000);
    mw_setCacheBackend($mw_backendClassName, 'cache_imagesizes', 0);
    mw_setCacheBackend($mw_backendClassName, 'extbase_object', 0);
    mw_setCacheBackend($mw_backendClassName, 'extbase_reflection', 0);
} else {
    mw_setCacheBackend($mw_backendClassName, 'cache_hash');
    mw_setCacheBackend($mw_backendClassName, 'cache_pages');
    mw_setCacheBackend($mw_backendClassName, 'cache_pagesection', 2592000);
    mw_setCacheBackend($mw_backendClassName, 'cache_rootline',2592000);
    mw_setCacheBackend($mw_backendClassName, 'cache_imagesizes', 0);
    mw_setCacheBackend($mw_backendClassName, 'extbase_datamapfactory_datamap', 0);
}

标签: phpcachingtypo3command-line-interface

解决方案


看看你的代码:

if (PHP_SAPI !== 'cli' && TYPO3\CMS\Core\Utility\GeneralUtility::getApplicationContext() !== 'Development' && $mw_apcAvailable && $mw_apcEnabled) {
    $mw_backendClassName = $mw_apcExtensionLoaded ? 'TYPO3\\CMS\\Core\\Cache\\Backend\\ApcBackend'
    : 'TYPO3\\CMS\\Core\\Cache\\Backend\\ApcuBackend';
} else {
    $mw_backendClassName = 'TYPO3\\CMS\\Core\\Cache\\Backend\\FileBackend';
}

APCu 仅用于PHP_SAPI !== 'cli',因此当您通过 cronjob/cli 执行代码时没有这样的缓存。cronjob 只会使用其 FileBackend 清除此缓存。


推荐阅读