Блог/Работа с getCache

Работа со сниппетом getCache

Автор: Кудашев Сергей

Относительно запоздалый пост, но не потерявший своей актуальности. MODx Revolution обладает прекрасно системой кеширования, однако не идеальной. Проблема в том, что при очищении кеша из админки, очищаются закешированные данные сниппетов, что при следующем обращении к сайту все они вынуждены вызываться и нагружать систему. Соответственно, решил с этим посмотреть, есть ли возможность избежать этого.

Да, такая возможность нашлась. Ещ в далеком 2013 году opengeek, один из идеологов MODx, понимая данное узкое место системы, написал прекрасный сниппет getCache (https://modx.com/extras/package/getcache), который расширяет возможности базовой системы кеширования и позволяет кешировать данные вывода других элементов MODx на заданное время и заданным способом.

Использование getCache позволяет нам зафиксировать вывод нужных нам сниппетов в отдельном кеше, который будет управляться по своему и следовательно не будет обновляться после каждого очищения кеша в административной части. На вход сниппет принимает следующие параметры:

  • namespace – устанавливает префикс для плейсхолдеров для уникализации использования getCache
  • element – имя элемента MODx вывод которого кешируем
  • elementClass – класс элемента MODx который обрабатываем, по умолчанию modSnippet.
  • cacheKey – ключ, который будет использоваться для хранения кеша, по умолчанию cache_resource.
  • cacheHandler – обработчик кеша, по умолчанию cache_resource.
  • cacheExpires – время в секундах, на которое кешируются данные.
  • cacheElementKey – идентификатор по которому осуществляется кеширование. Если не определено иное, то используется уникальное сочетание основанное на Resource, свойств переданных элементу, который мы кешируем, и любых нестандартных параметров в $_REQUEST.
  • toPlaceholder – название плейсхолдера куда элемент передает свой вывод. Позволяет кешировать сниппеты, которые не работают непосредственно с выводом, а сохраняют все в плейсхолдер.

Вооружившись этими знаниями давайте воспользуемся данным сниппетом:

[[!getCache? &element=`pdoCrumbs` &cacheKey=`cache_all` &cacheExpires=`0` &showHome=`0` &scheme=`abs`]]

, в данном случае мы будем кешировать вывод сниппета pdoCrumbs, кеш данные которого будут накапливаться в папке cache_all в core/cache и при этом никогда не будет удаляться, если мы его не удалим принудительно. При этом, если мы воспользуемся очисткой кеша в административной части, то данный сброс кеша никак не повлияет на кеш от данного сниппета. Проверьте.

Это ровно то, что нам надо, но есть один нюанс. Теперь если мы хотим сбросить кеш для наших хлебных крошек, то нам придется или идти во вкладку File или подключаться по FTP/SFTP и вручную удалять папку cacheAll, чтобы очистить кеш. Можно ли с этим что-то сделать, да можно.

Данный сниппет содержит процессор, который позволяет нам удалять произвольные части кеша используемые getCache. Использование данного процессора возможно или через PHP через вызов метода modX::runProcessor() или используя JavaScript.

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

getCache найтройка вызова меню

В поле Lexicon Key (Ключ словаря) ставим например refreshparts, в поле Description (Описание) ставим например refreshparts_desc, в Permissions (Права доступа) обязательно добавляем empty_cache, в Namespace (Пространство имен) добавляем core. В поле Handler (Обработчик) добавляем следующий код:

var partitions = 'cacheAll';
var topic = '/clearpartitions/';
this.console = MODx.load({
	xtype: 'modx-console'
	,register: 'mgr'
	,topic: topic
	,show_filename: 0
});
this.console.show(Ext.getBody());

MODx.Ajax.request({
	url: MODx.config.assets_url+'components/getcache/connector.php'
	,params: { action: 'cache/partition/refresh', partitions: partitions, register: 'mgr' , topic: topic }
	,listeners: {
		'success':{fn:function() {
			this.console.fireEvent('complete');
			this.console = null;
		},scope:this}
	}
});
return false;

Обновляем окно браузера административной части через Ctrl+F5 и видим, что у нас появилось

getCache вызов меню

Переходим в Lexicon (Пространство имен) в меню системных настроек и в Пространстве имен core и Топике topmenu задаем описания наших кнопок через заполнение параметров словаря refreshparts и refreshparts_desc. Обновляем админку, проверяем, что подгрузилось пространство имен. Проверяем работу.

getCache вызов меню

Хочу отметить, что в переменную partitions можно передавать несколько ключей кеша (то есть фактически папок, в которых данные будут храниться). Благодаря этому у нас появляется еще большая гибкость. Например я задаю редкообновляемой навигации по сайту один ключ, а для часто обновляемых элементов другой ключ. И могу очистить их вместе, задав переменную var partitions = 'cacheNavig,cacheAll';, а могу по отдельности. А можно сделать отдельные кнопки по аналогии с этой на часто обновляемые части. Надеюсь кому-то будет полезно :)

Комментарии (1)

  1. Rahim11 июня 2020, 00:12#
    Приветь!

    Как сделать чтоб кэш удалился если в этом категории при публикации или обновлен ресурс!