Чтобы гарантировать, что все блоки в кэше, нужно знать, какие блоки существуют. Первый перечень был написан руками: главная и категории. Всё остальное — товарные страницы, статьи, формы — в него не входило и грелось только тогда, когда кто-то это открыл.
Это седьмая часть цикла «Кэш фрагментов и Redis».
Обходчик читает разметку
Обходчик страниц всё равно получает HTML каждой страницы. Из него можно вынуть контейнеры блоков — с их параметрами — и записать в реестр ячеек:
<div class="loadBlock"
data-block="grid"
data-type="product"
data-cat="42"
data-count="24"></div>
preg_match_all('/<div[^>]+class="[^"]*loadBlock[^"]*"[^>]*>/', $html, $m);
foreach ($m[0] as $tag) {
preg_match_all('/data-([a-z-]+)="([^"]*)"/', $tag, $attrs, PREG_SET_ORDER);
$args = [];
foreach ($attrs as $a) {
$args[$a[1]] = html_entity_decode($a[2]);
}
frag_registry_add($args['block'], $args);
}
На каталоге среднего размера охват вырос с «главная + категории» до 1030 ячеек — без единой строки перечня руками.
Один источник правды
Все параметры ajax-запроса должны лежать в разметке, а скрипт — читать их оттуда. Если скрипт добавляет параметр от себя, обходчик о нём не узнает, и прогреется не та ячейка (двенадцатая часть).
Чего в разметке нет
- параметры, зависящие от ширины окна (сколько карточек в ряду), — их знает только браузер. Такие ячейки берутся из реестра живых запросов: каждый MISS или STALE от посетителя записывает свои параметры;
- первый экран — сервер отдаёт его готовым в HTML страницы, фронт его не запрашивает, греть его как блок не нужно.
Реестр живых ячеек
Запросы посетителей тоже пополняют реестр: всё, что пришло на MISS или STALE, записывается вместе с параметрами. Повторы убираются раз в 6 часов, запись живёт 14 дней. При выкате весь реестр высыпается в очередь прогрева — так после смены кода греется не только то, что нашёл обходчик, но и то, что реально запрашивали.
Не знаете, сколько у вас блоков и все ли они в кэше?
Пришлите адрес — соберу перечень ячеек по разметке.
// загружаю комментарии…