На тестовой копии сайта посетителей нет, а прогрев работает так же, как на рабочем: обходит страницы, рендерит блоки, сторож проверяет полноту. Цена — около 1,5 ядра процессора круглосуточно ради кэша, который никто не откроет. А при разработке прогрев ещё и мешает: правишь шаблон, а воркер тут же переписывает ячейки.
Это сороковая часть цикла «Кэш страниц без MISS».
Два ключа в wp-config
| Ключ | Что выключает | Что остаётся |
|---|---|---|
CACHE_WARM_DISABLED | весь прогрев: обход страниц, воркер блоков, сторож полноты, ускоренный догрев | сам кэш и инвалидация — сбросы работают как обычно |
CACHE_DISABLED | всё перечисленное плюс сам кэш: страницы и блоки не хранятся | ничего — сайт работает без кэша |
// wp-config.php тестовой копии
define('CACHE_WARM_DISABLED', true); // только прогрев
// define('CACHE_DISABLED', true); // или кэш целиком — на время вёрстки
Как выключается кэш страниц из PHP
Кэш страниц живёт в nginx, и PHP его, казалось бы, не контролирует. Но nginx слушается заголовка X-Accel-Expires от приложения:
add_action('send_headers', function () {
if (defined('CACHE_DISABLED') && CACHE_DISABLED) {
header('X-Accel-Expires: 0'); // nginx не сохранит этот ответ
}
});
Это работает, потому что в fastcgi_ignore_headers у нас перечислены только Cache-Control и Expires. Если там есть и X-Accel-Expires, nginx заголовок проигнорирует.
Ворота в точках входа
Каждая точка входа прогрева начинается одной строкой. Плюс плановые события крона снимаются с расписания, чтобы не просыпаться впустую:
function cache_warm_enabled(): bool {
return !(defined('CACHE_WARM_DISABLED') && CACHE_WARM_DISABLED)
&& !(defined('CACHE_DISABLED') && CACHE_DISABLED);
}
add_action('warm_worker', function () {
if (!cache_warm_enabled()) return;
// ...
});
Грабли
- Включили CACHE_DISABLED — а страница всё равно из кэша. Разовый полный сброс при появлении ключа делает PHP, а HIT-страница до PHP не доходит. Нужен хотя бы один запрос, который дойдёт до PHP: любая страница не из кэша или вход в админку.
- Устаревший блок при выключенном прогреве живёт до конца срока — неделю: обновлять его фоном некому. Поэтому при выключенном прогреве устаревшая ячейка читается как MISS и пересобирается сразу.
- Проверочный скрипт без ключа сам наполняет очереди. Один запуск зонда на тесте поставил в очередь 357 адресов и 2506 задач — и всё это потом честно греется.
Тестовая копия грузит сервер без посетителей?
Пришлите адрес — помогу выключить прогрев так, чтобы инвалидация продолжала работать.
// загружаю комментарии…