Всем известно что первый шаг для увеличения производительности — это кэширование. MODx умеет кэшировать странички и сниппеты, но это все далеко не всегда применимо. Есть всякие CacheAccelerator, но иногда хочется простого и ясного способоа работы с кэшем при написании собственного сниппета.
В этом посте я расскажу как работать с кэшированием в собственном сниппете MODx используя системные библиотеки. И покажу это все на примере.
Я гуглил. Я очень много гуглил в поисках информации о кэшировании в API. Я находил только описания функций clearCache и getCachePath, которые, разумеется, не подходят для работы с кэшем, которую мы собираемся производить. Я гуглил по запросам "MODx API cache" или "MODx cache snippet" и подобным, но ничего вменяемого так и не нашел.
Я подумал, что очень вряд ли в такой системе нет готового класса для работы с кэшем. И полез. Лазить я начал с того места, где находился мой файл-менеджер. А именно — с директории
/manager/media/rss/
И в ней я углядел такой вот файл:
/manager/media/rss/rss_cache.inc
Собственно, это не что иное, как класс кэширования. Вполне нормальный, рабочий и универсальный не смотря на 'rss' в пути и названии.
Чтобы понять как им пользоваться и как он работает — напишем тестовый сниппет.
$basePath = $modx->config['base_path'];
$cacheDir = $basePath.$modx->getCachePath();
$cacheAge = 15;
require_once($basePath.'manager/media/rss/rss_cache.inc');
$cache = new RSSCache($cacheDir, $cacheAge);
$cache_status = $cache->check_cache('key');
if($cache_status == 'HIT') {
$output = $cache->get('key');
echo('Getted from cache');
}
if(!$output) {
//добываем $output обычным способом
$output = rand(0,100500);
$cache->set('key',$output);
echo('Cache stored');
}
return $output;
Если его запустить впервые — мы увидим какое-то число и сообщение о том, что оно загружено в кэш. Если мы обновляем страничку — мы увидим это же число и сообщение о том, что оно было взято из кэша.
Если проходит 15 секунд ($cacheAge) с момента первого вызова — число генерируется снова и кэш обновляется. Дальше поведение повторяется.
Вот такой простой и незамысловатый синтаксис и модель использования.
Остается добавить что RSSCache может сохранять не только простые переменные, но и сложные — объекты и массивы любой вложенности (в том числе и рекурсивные) из-за использования serialize/unserialize.