Кэширование данных

Добрый день,
делаю кэширование данных
$cacheName = "cachename";
$output = $modx->cacheManager->get($cacheName);
if (empty($output))
{

...

$modx->cacheManager->set($cacheName, $output, 8640000);
}
return $output;
Все работает, кэш сохраняется в core/cache/default/. при сохранении страниц, кэш не очищается, очищается только при выборе меню Управление->Очистить кэш.
Но еще он очищается при сохранении любого чанка, сниппета и т.п.
Можно как-то сохранять кэш, чтобы он не очищался при редактировании чанков/сниппетов. Но чистился при очистке всего кэша?
Аркадий
08 февраля 2021, 16:26
modx.pro
81
0

Комментарии: 3

Наумов Алексей
08 февраля 2021, 16:49
+2
Я сохранял свой кеш в отдельную папочку (назвал ее для примера my_cache), вот выдержки кода из проекта… (у меня некий класс, в нем есть такие методы и переменные).
Насколько помню, проблемы с очисткой при сохранении ресурса или чанка не было.

/** @var  string $cachePartition Раздел для кеша */
    protected $cachePartition = 'my_cache';
/** @var  integer $cacheTime Время кеша, в секундах, например 86400 (сутки), 3600 (час) */
    protected $cacheTime = 43200;
/**
     * Получает данные запроса из кеша
     * @param $cacheKey string Ключ кеша
     * @return mixed Данные запроса или false
     */
    protected function getDataFromCache($cacheKey) {
        $options = array(
            xPDO::OPT_CACHE_KEY => $this->cachePartition
        );
        return $this->modx->cacheManager->get($cacheKey, $options);
    }

    /**
     * Помещает данные в кеш
     * @param $cacheKey string Ключ кеша
     * @param mixed $data Данные, который нужно закешировать
     * @return bool Результат операции
     */
    protected function addDataToCache($cacheKey, $data) {
        $options = array(
            xPDO::OPT_CACHE_KEY => $this->cachePartition
        );
        return $this->modx->cacheManager->add($cacheKey, $data, $this->cacheTime, $options);
    }
Но нужен плагин для очистки нашего кеша:
<?php

switch ($modx->event->name) {
    case 'OnSiteRefresh':
        if ($modx->cacheManager->refresh(array('my_cache' => array()))) {
            $modx->log(modX::LOG_LEVEL_INFO, $modx->lexicon('refresh_default') . ': MyCache');
        }
        break;
}
    Аркадий
    11 февраля 2021, 10:47
    0
    Наумов Алексей, спасибо больше, у меня отдельного класса нет, но ответ помог реализовать то, что хотелось, сделал так:
    $cacheName = "asn1cache-" . basename($file) . "-" . filesize($file) . "-" . date('d.m.Y-H.i.s', filemtime($file));
    $cachePartition = "asn1";
    $output = $modx->cacheManager->get($cacheName,array(xPDO::OPT_CACHE_KEY=>$cachePartition));
    if (empty($output))
    {
    ....
    
        // Устанавливаем бессрочный кэш
        $modx->cacheManager->set($cacheName, $output, 0,array(xPDO::OPT_CACHE_KEY=>$cachePartition));
    }
    return $output;
    И соответственно плагин, чтобы кэш очищался:
    <?php
    switch ($modx->event->name) {
        case 'OnSiteRefresh':
            if ($modx->cacheManager->refresh(array('asn1' => array()))) {
                $modx->log(modX::LOG_LEVEL_INFO, $modx->lexicon('refresh_default') . ': ASN1');
            }
            break;
    }
    Кэш теперь сохраняется в папке /core/asn1 и очищается только при очистке всего кэша
      Наумов Алексей
      11 февраля 2021, 10:54
      0
      ну вот, отлично!
      Это правильно хранить свой кеш в отдельной папочке и управлять им как нужно!
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3