Сбрасывать кэш на каждое сохранение записи — самая простая стратегия. На сайте с обменом 1С она превращается в шторм: обмен «сохраняет» сотни товаров, ничего в них не меняя, и каждый раз выбивает каталог. Мы называем лечение анти-штормом: сбрасывать только тогда, когда данные действительно изменились.

Это пятнадцатая часть цикла «Кэш страниц без MISS».

Откуда берутся холостые сбросы

ИсточникЧто происходитЛечение
пустое сохранение в конце обменазапись «сохраняется» без единого измененияподпись значимых полей (заголовок, статус, адрес, миниатюра) в мете; совпала — не сбрасывать
производные метыпересобираются через удаление и запись на каждом сохранениисравнивать значение, а не факт записи
счётчики посетителейпросмотры и лайки сбрасывали кэш своей категории раз в минуту — за ночь 2,2 ГБ осиротевших записейне сбрасывать по счётчикам
служебные метыблокировка редактирования, статусы интеграцийпропускать меты с _ в начале, кроме миниатюры
дрожь порядкавнешняя система перенумеровывает товары, позиции скачут на 1–2 — около 5000 сбросов в суткилечить на стороне источника: не перенумеровывать всё, слать только разницу
термины без измененийобмен заново назначает те же категориисравнивать старый и новый набор

Для страниц картина была такая: волны обмена каждые ~10 минут выбивали по 57–76 адресов, а волна больше 300 адресов вела к полному сбросу кэша.

Подпись значимых полей

add_action('save_post_product', function ($id, $post) {
    $sig = md5(implode('|', [
        $post->post_title,
        $post->post_status,
        $post->post_name,
        get_post_meta($id, '_thumbnail_id', true),
    ]));
    if (get_post_meta($id, '_cache_sig', true) === $sig) {
        return; // ничего значимого не изменилось
    }
    update_post_meta($id, '_cache_sig', $sig);
    cache_queue_purge_for_post($id);
}, 30, 2);

Обратная ловушка

Перестараться так же опасно. На одном сайте «реальные» изменения сузили до цены, подписи и миниатюры — и правки контентщика в описаниях перестали появляться на сайте. Список сигналов должен быть широким: любая мета, кроме тех, что доказанно дрожат.

И «доказанно» — ключевое слово. На другом сайте поле порядка дало 5114 сбросов за сутки — но это был реальный пересев каталога, а не дрожь. Отключить его вслепую значило бы потерять настоящие изменения.

Телеметрия причин

Без счётчиков анти-шторм настраивается вслепую. Каждый сброс увеличивает счётчик своей причины в опции — и через сутки видно, кто шумит:

function cache_count_reason(string $reason): void {
    $stats = get_option('cache_bump_stats', []);
    $stats[$reason] = ($stats[$reason] ?? 0) + 1;
    update_option('cache_bump_stats', $stats, false);
}

Формула: чтение «отдай старое, обнови фоном» делает сбросы безболезненными, анти-шторм — осмысленными. Нужны оба: без первого каждый сброс — MISS, без второго процессор занят пересборкой того, что не менялось.

Обмен с 1С выбивает кэш каждые несколько минут?

Пришлите адрес — найду, что сбрасывает кэш впустую.

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

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

Комментарии

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

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