modMonitor. Кейс: поиск причины сброса кеша

Вот сейчас мне модмонитор сохранил кучу времени и нервных клеток. Хочу поделиться этим кейсом, так как он раскрывает весьма неочевидные, но при этом очень мощные возможности данного компонента.

Предыстория: клиент пишет, что показатели сайта в тестах гугла PageSpeed Insights низкие. Полез проверять. Обратил внимание, что гугл жалуется на долгий ответ от сервера (1.3 сек). Я удивился, так как перед тестом специально захожу на главную страницу, чтобы она закешировалась. Но нет, с каждым тестом как минимум на одной из версий (мобильной и обычной) долгий ответ. Здесь еще тонкость в том, что на сайте реализована отдельно мобильная версия и кеш у них раздельный. Полез опять в админку, проверяю настройки кеша где можно — везде все ОК. При этом проверяю кеш-файлы — а они постоянно сбрасываются, то есть для двух-трех документов они создаются, а потом сбрасываются.

В общем, я перепроверил в нескольких местах, где предполагал причины, но там все ОК. В итоге, я решил отследить возможный запрос, при котором происходил бы сброс кеша. Что я сделал? С большой долей вероятности, кеш сбрасывался штатным механизмом MODX-а, а точнее xPDO, а значит мне требовалось отследить вызов метода xPDOCacheManager::deleteTree(). Для этого я в него прописал вот такой код:
if($this->xpdo->modMonitor){
    $this->xpdo->modMonitor->addItem(array(
        "type"  => "cacheClean",
        "properties"    => json_encode($options),
    ));
}
Что он делает? Он добавляет в логируемому запросу кастомный элемент (Это та сущность, которую видно в детальном просмотре запроса и во втором интерфейсе всех элементов.). Дело в том, что модмонитор умеет сохранять информацию не только о чанках и сниппетах, но и вообще о любом произвольном элементе. К примеру, вы можете создать свой плагин на какое-нибудь событие, и в нем прописать подобный код, а потом отслеживать все запросы, где происходил этот вызов. Здесь важный момент еще и в том, что объект модмонитор вызывается при любой инициализации MODX-а, и с ним работать можно вообще из любой точки.

Итак, прописываю я этот код, после чего иду в phpMyAdmin и пишу запрос
SELECT count(*), request_id FROM `monitor_request_items` WHERE `type` LIKE 'cache%' group by 2

И с некоторой периодичностью обновляю его. И тут хоп, рыбка клюнула :) Показывает id запроса, при котором произошел вызов сброса кеша. Иду в модмонитор, указываю этот ID в фильтр поиска, жму Enter, и что я там вижу?



Вот жешь засада! Явно крон не верно настроен. Скрипт обновления курсов вызывается каждую минуту, а там и сброс кеша как раз прописан. Полез в крон, таки да, вызов каждую минуту :) Поправил, и все, перестал сбрасываться кеш. И гугл подобрел))
Fi1osof
15 ноября 2016, 02:08
modx.pro
1
1 998
+8

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0