Задача планировщика TYPO3, выполняемая через cli, не очищает кеш страниц при использовании пользовательского кеширующего сервера - PullRequest
0 голосов
/ 26 марта 2020

Я использую TYPO3 9.5.14 и импортирую Новости из внешней базы данных. После импорта я хочу очистить кеш страницы, на которой отображаются новости.

Я использую бэкэнд кэширования apcu, поэтому я не использую стандартный бэкэнд кэширования базы данных TYPO3. Я создал задачу планировщика для импорта новостей, и вот проблема:

Когда я вызываю задачу планировщика через модуль backend, тогда все в порядке. Новости импортируются, а кеш страниц очищается. Но когда 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);
}

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Проблема в том, что ap c (u) зависит от sapi / context. Вы не можете получить доступ / работать с кешем ap c (c) из другого контекста.

Так работает ap c (u).

Это означает, что вы не можете установить значение в контексте sapi (fpm, cli, cgi,) и получить к нему доступ из другого. Между ними нет никакой связи.

Так что, даже если вы включите настройки от ap c (u) до php .ini в cli (что по умолчанию отключено), и сконфигурируете внутренний адаптер Typo3 для APCU также, как правило, он будет работать - как отдельные хранилища контейнера данных.

Более того, каждый вызов скрипта / процесса cli будет начинаться с пустого нового хранилища данных acpu.

Это ограничение от ap c (u), а не Typo3. И ничего, адаптер или typo3 могут преодолеть или изменить поведение.

Если вы используете CLI и WebRequest, используя общий кеш (файл, база данных, redis, memcache), все будет хорошо.

Это делает APCU в основном бесполезным, если вы хотите удалять / перестраивать кеши из командной строки, которые используются в другом, не относящемся к контексту.

0 голосов
/ 26 марта 2020

Посмотрите на ваш код:

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 / кли. Cronjob очистит этот кеш только с помощью FileBackend.

...