Кэширование данных
Добрый день,
делаю кэширование данных
Но еще он очищается при сохранении любого чанка, сниппета и т.п.
Можно как-то сохранять кэш, чтобы он не очищался при редактировании чанков/сниппетов. Но чистился при очистке всего кэша?
делаю кэширование данных
$cacheName = "cachename";
$output = $modx->cacheManager->get($cacheName);
if (empty($output))
{
...
$modx->cacheManager->set($cacheName, $output, 8640000);
}
return $output;
Все работает, кэш сохраняется в core/cache/default/. при сохранении страниц, кэш не очищается, очищается только при выборе меню Управление->Очистить кэш.Но еще он очищается при сохранении любого чанка, сниппета и т.п.
Можно как-то сохранять кэш, чтобы он не очищался при редактировании чанков/сниппетов. Но чистился при очистке всего кэша?
Комментарии: 3
Я сохранял свой кеш в отдельную папочку (назвал ее для примера 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;
}
Наумов Алексей, спасибо больше, у меня отдельного класса нет, но ответ помог реализовать то, что хотелось, сделал так:
$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 и очищается только при очистке всего кэша
ну вот, отлично!
Это правильно хранить свой кеш в отдельной папочке и управлять им как нужно!
Это правильно хранить свой кеш в отдельной папочке и управлять им как нужно!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.