Сбрасывать кэш на каждое сохранение записи — самая простая стратегия. На сайте с обменом 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С выбивает кэш каждые несколько минут?
Пришлите адрес — найду, что сбрасывает кэш впустую.
// загружаю комментарии…