php - 使用自定义缓存后端时,通过 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);
}
解决方案
看看你的代码:
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 清除此缓存。
推荐阅读
- android - 将内部文本文件附加到 Gmail
- javascript - 测验结束时如何显示错误答案?
- javascript - 如何在 JavaScript asp.net 中序列化表单
- laravel - 如何在 laravel 项目中使用苹果功能管理登录?
- angular - 将 id 与 firebase 元素匹配并获得相同的元素
- java - 记录验证通过字符串比较识别错误记录
- swift - Swift 5.0 圆形 UIButton
- python - 用于 3D 对象的 PyOpenGL 恒定大小 2D 标签
- exchange-server - 在规则中交换在线模式
- java - 使用 PanacheEntityResource 的 Quarkus 自定义休息端点