Кажется, что «сбросить кэш страницы» и «пометить страницу устаревшей» — одно и то же. В nginx это не так. У него нет команды «пометь устаревшим, отдавай старое, пока обновляется». Есть только удаление файла. А удалённую копию нельзя отдать даже как устаревшую: следующий посетитель получит MISS.
Это тринадцатая часть цикла «Кэш страниц без MISS».
Как это выглядело
На одном сайте редактор поправил поле товара в админке. Очередь чистки получила 2 адреса, очередь прогрева — 0. Следующий посетитель открыл страницу с MISS. В коде прямо стоял комментарий: «чистим без прогрева — прогрев дорог».
Чистка без прогрева — это MISS, отложенный до первого посетителя. Прогрев дорог ровно столько же, сколько рендер для посетителя, — разница только в том, кто ждёт.
Правило 1: первым посетителем должны быть мы
Сразу после чистки страница запрашивается заново — сервером, а не человеком. Чтобы редактор не ждал этого при сохранении, работа делается после отправки ответа:
add_action('shutdown', function () {
if (empty($GLOBALS['cache_pending_paths'])) {
return;
}
// отдать ответ браузеру, дальше работать без него
if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
}
foreach ($GLOBALS['cache_pending_paths'] as $path) {
cache_purge_path($path); // удалить все файлы этого адреса
cache_warm_path($path); // и сразу запросить заново
}
});
Правило 2: греть все варианты ключа
Один адрес — это несколько ячеек: мобильная и десктопная версия, языки (шестая часть). Чистка по файлам удаляет их все, а прогреть легко только один — обычным запросом без кук.
На сайте с двумя языками на одном адресе удалилось 8 ячеек, прогрелась одна, и посетитель со второй языковой кукой получил MISS.
Поэтому прогрев делается во всех вариантах: два User-Agent (телефон и компьютер) × (без куки + каждый язык).
function cache_warm_path(string $path): void {
$agents = [UA_DESKTOP, UA_MOBILE];
$cookies = ['', 'lang=ru', 'lang=by'];
foreach ($agents as $ua) {
foreach ($cookies as $cookie) {
cache_request($path, $ua, $cookie);
}
}
}
Для правок из админки прогрев идёт сразу. Для потока из 1С — через общую очередь прогрева, иначе каждая волна обмена превратится в сотни синхронных запросов (восемнадцатая часть).
Как проверить
- Прогрейте адрес во всех вариантах кук и устройств.
- Сохраните запись в админке.
- Через пару секунд запросите все варианты — каждый должен быть HIT.
После правок в админке сайт открывается медленно?
Пришлите адрес — проверю, что делает ваш сброс кэша.
// загружаю комментарии…