В четвёртой части мы перевели кэш страниц на неделю и честно записали цену: пропущенный сброс теперь стоит неделю устаревшего контента. Проверка не заставила себя ждать — на следующий день после перехода на одном сайте нашлись четыре класса дыр в инвалидации. При кэше на 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: отложенная публикация по крону может не вызвать обычный сброс по сохранению.

Собираетесь удлинить кэш?

Пришлите адрес — пройду по источникам данных и найду дыры в сбросе до того, как они проявятся.

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.