Кажется, что «сбросить кэш страницы» и «пометить страницу устаревшей» — одно и то же. В 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С — через общую очередь прогрева, иначе каждая волна обмена превратится в сотни синхронных запросов (восемнадцатая часть).

Как проверить

  1. Прогрейте адрес во всех вариантах кук и устройств.
  2. Сохраните запись в админке.
  3. Через пару секунд запросите все варианты — каждый должен быть HIT.

После правок в админке сайт открывается медленно?

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

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

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

Комментарии

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

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