В четвёртой части мы перевели кэш страниц на неделю и честно записали цену: пропущенный сброс теперь стоит неделю устаревшего контента. Проверка не заставила себя ждать — на следующий день после перехода на одном сайте нашлись четыре класса дыр в инвалидации. При кэше на 30 минут их никто не замечал: они самолечились.
Это семнадцатая часть цикла «Кэш страниц без MISS».
1. Мета пишется после сохранения
Перечни и группировки, зависящие от меты, сбрасывались по save_post. Но 1С пишет мету после сохранения записи. Сброс срабатывал раньше, чем приходили данные. Вдобавок группировка вариантов товара лежала во временном кэше на 12 часов — и страница с устаревшей группировкой застывала на неделю.
Симптом из жалобы: «на одном компьютере две карточки, на другом — одна с семью вкладками». Разные варианты ключа собирались до и после прихода меты.
Лечение — сбрасывать по изменению меты (updated_post_meta, added_post_meta), а не только по сохранению записи.
2. Пропуски «ради анти-шторма»
Часть сбросов когда-то отключили, чтобы не было шторма, с обоснованием «всё равно обновится через полчаса». При неделе это обоснование умерло, а пропуски остались.
Правило: переходите на длинный кэш — пересмотрите каждый пропуск сброса. Если его оправдание — короткая валидность, он стал дырой.
3. Производные меты
Некоторые меты пересобираются кодом при каждом сохранении. Сбрасывать по факту их записи нельзя — будет шторм. Не сбрасывать нельзя — их значения выводятся на страницах. Решение — сверять подпись значений после того, как пересборщики отработали:
// пересборщики висят на приоритетах 15 и 20 — сверяем после них
add_action('save_post_product', function ($id) {
$sig = md5(serialize([
get_post_meta($id, 'variants_group', true),
get_post_meta($id, 'fits_models', true),
]));
$old = get_post_meta($id, '_derived_sig', true);
update_post_meta($id, '_derived_sig', $sig);
if ($old === '') {
return; // первое сохранение только заводит подпись
}
if ($old !== $sig) {
cache_queue_purge_for_post($id);
}
}, 30);
Первое сохранение только заводит подпись. Иначе первая же волна обмена после выката сбросит весь каталог.
4. Настройки в шапке и подвале каждой страницы
Контакты региональных поддоменов хранились в отдельной записи, а общие настройки темы — в опции. Сохранение такой записи чистило только её собственный адрес, опцию никто не отслеживал. А выводилось это в шапке и подвале каждой страницы. Поддомен неделю показывал пустую ссылку на мессенджер.
Лечение — чистка кэша по хосту: хост читается из той же строки KEY:, что и путь (четырнадцатая часть), и уходят все страницы поддомена. Опции темы добавлены в отслеживаемые.
Вопрос, который надо задать про каждый источник данных
Какой хук чистит страницы, на которых это выведено?
правило после перехода на неделю
И отдельно проверьте transition_post_status: отложенная публикация по крону может не вызвать обычный сброс по сохранению.
Собираетесь удлинить кэш?
Пришлите адрес — пройду по источникам данных и найду дыры в сбросе до того, как они проявятся.
// загружаю комментарии…