Как не чистить кэш всего сайта?

Постоянно задают вопросы "а как при сохранении чистить кэш не всего сайта, а только обновляемого ресурса?".

А вот так:

<?php
switch($modx->event->name) {
  case 'OnDocFormRender':
    $resource->set('syncsite', 0);
  break;
  
  case 'OnDocFormSave':
    if ($modx->event->params['mode'] != 'upd') {return;}
    $resource->_contextKey = $resource->context_key;
    $cache = $modx->cacheManager->getCacheProvider($modx->getOption('cache_resource_key', null, 'resource'));
    $key = $resource->getCacheKey();
    $cache->delete($key, array('deleteTop' => true));
    $cache->delete($key);
  break;
}

Создать плагин с любым именем, назначить ему события OnDocFormRender и OnDocFormSave, скопипастить.

Первое событие плагина убирает галочку "Очистить кэш" у формы редактирования ресурса. Если включить ее вручную - кэш будет очищен, как обычно.

Второе - получает обработчика кэша ресурсов и говорит ему удалить запись нужного документа. Все остальные не трогаются.

У простых ресурсов кэш хранится в одном файле, у сложных (где вызываются кэшируемые сниппеты) - в директории. Поэтому, мы чистим сначала директорию, а потом и файл, чтобы наверняка.

С компонентом Articles этот фокус не работает - там нет syncsite в админке.

← Предыдущая заметка
Wayfinder и количество документов в контейнере
Следующая заметка →
Тег spoiler для Jevix
Комментарии (27)
Денис
09.11.2012 12:22

Спасибо большое!

Антон Слободчук
09.11.2012 12:40

Странно, что разработчики MODX не добавили эту функциональность по умолчанию. Я думал, что это связано с тем, что «куски» кэша ресурса могут хранится не только в /resources/id-ресурса.

vancheloИван Брежнев
09.11.2012 13:04

Нет, они не добавили потому что ресурс может быть использован в списках, и при обновлении одного ресурса список останется со старыми данными

vancheloИван Брежнев
09.11.2012 13:05

Просто нужно заранее предусмотреть где и что вам нужно чистить

k07nAndrei Kilin
09.11.2012 13:05

Василий уже писал об этом. Да, из-за возможных хитрых взаимодействий ресурсов приходится чистить весь кэш. http://modx.com/blog/2012/10/29/optimization-with-getcache-and-custom-cache-partitions/

lxndrrlAlexander Orel
10.11.2012 20:05

Спасибо!

alexeytulaАлексей
14.11.2012 06:00

А почему

$resource = $modx->event->params['resource'];

?

Если открыть документацию rtfm.modx.com/display/revolution20/OnDocFormSave, то в Event Parameters мы видим resource, зачем его еще раз вытаскивать?

bezumkinВасилий Наумкин
14.11.2012 06:04

А что, по вашему есть Event Parameters?

По-моему, это массив $modx->event->params, из которого я и получаю ресурс.

Если я не прав — покажите, как надо.

alexeytulaАлексей
14.11.2012 06:06

Ну я так понял, глядя на пример ниже по той же ссылке, что переменная $resource сразу доступна, как и $mode и $id.

bezumkinВасилий Наумкин
14.11.2012 06:15

А я, глядя на исходник метода modX::invokeEvent(), понял, что нет.

alexeytulaАлексей
14.11.2012 06:24

Ну как же, ведь передаются параметры:

https://github.com/modxcms/revolution/blob/release-2.2/core/model/modx/processors/resource/create.class.php#L566

в параметр $params:

public function invokeEvent($eventName, array $params= array ())
bezumkinВасилий Наумкин
14.11.2012 06:30

Ну так я их и беру из $modx->event->params;, куда они передаются.

Кто, где, зачем и как выставляет $resource (и будет ли всегда выставлять, в дальнейших версиях) — мне неведомо. 100% я вижу одно — параметры, переданные для плагина, находятся вот тут: $modx->event->params.

Нравится брать их в $resource — вперед, никто вроде не мешает.

bezumkinВасилий Наумкин
20.11.2012 15:09

Прислушался к вашему совету — убрал лишнее присвоение.

Спасибо!

Peter Zenin
20.11.2012 14:45

Вместо:

$key = $resource->get('context_key') . '/resources/' . $resource->get('id');

можно вот так:

$key = $resource->getCacheKey();

Спасибо за заметку, долго мучался пока не нашел эту вашу запись.

Да и вообще спасибо за все остальное!

bezumkinВасилий Наумкин
20.11.2012 14:52

Ага, попробуйте проделать это в менеджере, getCacheKey() вернет вам 'mgr/resource/15'.

Сегодня придумал красивее:

$resource->_contextKey = $resource->context_key;
$key = $resource->getCacheKey();
Peter Zenin
20.11.2012 15:18

Ясно. А мне просто хотелось очистить кеш из сниппета (точнее из хука formit), только одного конкретного ресурса.

Раньше чистил через clearCache, там просто было. но он deprecated теперь.

Везде искал — нет примеров, только вот этот, ваш. (как-то криво на вы общаться)

Вот для себя составил формулу, сохраню тут в комментах себе на будущее :-):


$key = $docObj->getCacheKey(); // $docObj - объект ресурса, кеш которого надо почистить
$cache = $modx->cacheManager->getCacheProvider($modx->getOption('cache_resource_key', null, 'resource'));
$cache->delete($key, array('deleteTop' => true));
$cache->delete($key);
bezumkinВасилий Наумкин
20.11.2012 15:45

Да можно «на ты», я не старый.

А рецепт я взял с официального форума, только пришлось поразбираться с контекстами. Очень надеюсь, что ни примут мой коммит и можно будет тупо

$resource->clearCache();
Peter Zenin
20.11.2012 18:25

Да, только clearCache они отменяют. Сам интуитивно пробовал $resource->refresh() но не прокатило.

Noname Андрей
28.11.2012 13:32

Василий, здравствуйте! У меня вопрос по этому полезному плагину.

Под какую он версию modx и что значит убирает галочку «Очистить кэш»? Имеется в виду, что он это делает в процессе сохранения документа или он убирает ее у всех документов в панели редактирования?

Дело в том, что этот плагин у меня не хочет работать. Сделал все как сказано в описании. Извините за такие вопросы, я только начал изучать эту cms.

Заранее спасибо!

bezumkinВасилий Наумкин
28.11.2012 14:28

Я работаю только с MODX Revolution и на этом сайте мы говорим только про него.

Данный плагин проверялся на версии 2.2.5.

Он действует в 2 этапа: убирает галочку «Очистить кэш» при редактировании документа в админке, чтобы не обновлять кэш всех ресурсов, а потом при сохранении удаляет кэш текущей страницы.

Если вы только начинаете работать с MODX — Зачем вам такие вещи? Разбирайтесь сначала, не надо на кэширование сразу переходить.

Noname Андрей
28.11.2012 17:49

Спасибо за камент. К нам приходят разноплановые задачи, в этот раз пришла задача с modx, тормоза и прочее. Этот плагин весьма кстати пришелся. Спасибо. Заставить бы его только работать.

Noname Андрей
29.11.2012 09:27

Заработало. У вас в коде указано событие OnBeforeDocFormSave', а ниже в описании OnDocFormSave

olegproОлег Максименко
04.04.2013 07:48

Заметил интересный момент. С этим плагином начинает неконкретно работать авто публикация ресурсов. Так как весь кэш при сохранении ресурса не чистится, соответственно и не обновляется auto_publish в кеше (в нем хранится unixtime ближнего готовящегося к публикации ресурса).

Решение: Добавить к событию OnDocFormSave:


$contexts = array();
$query = $modx->newQuery('modContext');
$query->select($modx->escape('key'));
if ($query->prepare() && $query->stmt->execute()) {
    $contexts = $query->stmt->fetchAll(PDO::FETCH_COLUMN);
}
$modx->cacheManager->autoPublish(array_diff($contexts, array('mgr')));
Давид Мовсесян
03.04.2014 05:35

а вот как сделать так, чтобы при изменении любого документа на сайте или публикации нового документа чистился кеш только главной страницы? у меня просто на главной несколько новостных лент из разных контейнеров, снипеты вызываю кешированными, иначе тормоза.

Alexandr
16.05.2014 06:55

А вот у меня сайт обновляется по cron ежеминутно. Каждую минуту выгружаются новые данные и корректируются старые записи, т.е. файл с измененными данными отправляется на сервер по ftp, там скриптом вносятся изменения в БД, но для того, чтобы обновления были видны на сайте необходимо обновить кэш. И если запускать очистку всего кэша - то получается слишком долго. Как в таком случае делается очистка кэша конкретного измененного ресурса,

bezumkinВасилий Наумкин
16.05.2014 07:35

Смотри методы в Tickets - http://bezumkin.ru/sections/components/396/

valentink2410@gmail.comvalentink2410
17.10.2014 08:15

Василий, подскажи пожалуйста, как запретить чистить весь кэш при удалении и восстановлении нового документа в админке modx revo 2.14, заранее спасибо

bezumkin
Василий Наумкин
30.06.2022 03:58
Есть ли возможность формировать &quot;friendly URL aliases&quot;, используя аналог translit MODx? ...
bezumkin
Василий Наумкин
27.06.2022 03:32
Спасибо за исправления, очень выручаешь =) Но учитывая количество не описаных в заметке дополнительн...
bezumkin
Василий Наумкин
27.06.2022 03:10
что будет использоваться для вывода многоуровневого меню Посмотри как работают комментарии на этом ...
bezumkin
Василий Наумкин
25.06.2022 11:56
Поправил, спасибо!
bezumkin
Василий Наумкин
22.06.2022 10:08
Я обычно не пользуюсь RTE редакторами, потому что они пишут всякое непонятное что в HTML. Но можно в...
bezumkin
Василий Наумкин
21.06.2022 01:58
onLoad(data) { this.total = data.total }, и onLoad({total}) { this.total = total }, В нашем случ...
bezumkin
Василий Наумкин
20.06.2022 14:01
Прекрасно тебя понимаю, я когда сам в этом разбирался - голова дымилась. Но зато теперь прямо-таки п...
bezumkin
Василий Наумкин
20.06.2022 09:30
Не надо, оно по умолчанию так - я просто чуть более подробно написал.
bezumkin
Василий Наумкин
19.06.2022 13:42
А можно же из 1 файла сделать 2 экспорта. По-умолчанию, и отдельно для футера: export const Footer =...
bezumkin
Василий Наумкин
19.06.2022 09:44
Тебе спасибо, что поддерживаешь рублём мои начинания!