我正在使用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清除此缓存。
问题是,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主要无用。