通过cli执行的TYPO3调度程序任务在使用自定义缓存后端时不会清除页面缓存

问题描述 投票:0回答:2

我正在使用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);
}
php caching typo3 command-line-interface
2个回答
0
投票

查看您的代码:

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清除此缓存。


0
投票

问题是,apc(u)取决于sapi / context。您无法从其他上下文访问/使用apc(c)缓存。

这就是apc(u)的工作方式。

这意味着,您无法在sapi上下文(fpm,cli,cgi,)中设置valu并从另一个访问它。它们之间没有任何联系。

因此,即使您还通过cli中的php.ini设置启用了apc(u)(默认情况下也被禁用),并且还为APCU配置了Typo3后端适配器,它通常也可以工作-作为单独的数据容器孤岛。

此外,cli脚本/进程的每次调用都将从一个空的新acpu数据孤岛开始。

这是来自apc(u)的限制,而不是Typo3。而且,适配器或typo3不能克服或改变行为。

如果使用CLI和WebRequest,并使用共享的缓存(文件,数据库,redis,内存缓存),一切都会好起来的。

如果您要从命令行中删除/重建用于另一个非CLI环境的缓存,这会使APCU主要无用。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.