Жалоба звучала так: «переключаешь варианты товара — иногда долго». Иногда — значит, не всегда. Значит, кэш есть, но не везде. Разбор привёл к тому, что у точечной чистки была своя очередь прогрева — и она молча умирала.
Это тридцать третья часть цикла «Кэш страниц без MISS».
Что нашли
К полудню из 212 товарных страниц в кэше оставалось около 40. Остальные отвечали за 2,4–3,7 секунды вместо 0,016.
Точечная чистка после обмена 1С складывала адреса в собственную очередь прогрева и ставила разовое событие крона. Событие однажды не выполнилось — и больше никто его не ставил. Сторожа у этой очереди не было. Страницы чистились, но не прогревались.
Почему своя очередь — плохая идея
- у основного обходчика есть замок, перепланирование, сторож, обрыв по времени, защита по нагрузке — у самодельной очереди этого нет;
- каждая починка надёжности делается дважды — или забывается во втором месте;
- две очереди греют одни и те же адреса параллельно и мешают друг другу.
Решение
Точечная чистка кладёт адреса в голову очереди основного обходчика:
function warm_queue_push_front(array $paths): void {
wp_cache_delete('page_warm_queue', 'options');
$queue = (array) get_option('page_warm_queue', []);
$queue = array_values(array_unique(array_merge($paths, $queue)));
update_option('page_warm_queue', $queue, false);
warm_schedule_next(); // одна точка планирования — она же под сторожем
}
Срочное идёт первым, вся надёжность основного воркера достаётся точечной чистке бесплатно.
Общее правило: один воркер, одна очередь, одна точка планирования, один сторож. Каждый новый «быстрый путь» прогрева — это ещё одно место, где очередь может встать (тридцать пятая часть).
Страницы то быстрые, то медленные?
Пришлите адрес — проверю, не умирает ли у вас какая-то из очередей прогрева.
// загружаю комментарии…