Чтобы сбросить кэш одной страницы, нужно найти её файлы. Соблазн — вычислить ключ самому, взять md5 и удалить файл. Не работает: у адреса много вариантов, и ключ каждого вы не знаете заранее. Надёжный способ — пройти по файлам кэша и прочитать, что в них лежит.

Это четырнадцатая часть цикла «Кэш страниц без MISS».

Чистка по строке KEY

В начале каждого файла кэша nginx записывает строку KEY: с полным ключом. Из неё можно достать адрес и сравнить с нужным:

function cache_purge_paths(array $paths): int {
    $want = array_flip($paths);
    $removed = 0;
    $it = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator(CACHE_DIR, FilesystemIterator::SKIP_DOTS)
    );
    foreach ($it as $file) {
        $head = @file_get_contents($file->getPathname(), false, null, 0, 2048);
        if (!$head || !preg_match('/^KEY: \S*?(?:GET|HEAD)[^\/]*(\/[^\s:]*)/m', $head, $m)) {
            continue;
        }
        $path = strtok($m[1], '?');            // сравнивать без параметров
        if (isset($want[$path])) {
            @unlink($file->getPathname());
            $removed++;
        }
    }
    return $removed;
}

Так удаляются все варианты сразу — мобильный, языковые, с ?utm. Путь сравнивается без параметров, иначе варианты с метками останутся.

Дыра с главной

На одном сайте правка первого экрана в админке не появлялась на сайте до истечения срока кэша. В функции чистки нашлась строка:

if ($path === '/') return; // главную точечно не чистим

Причины в коде не было, в истории — тоже. После снятия исключения чистка главной удалила 2 файла, и правка появилась сразу.

Вторая причина там же: функция немедленной чистки для правок из админки была написана, но нигде не вызывалась. Все правки шли через задержку в 60 секунд, рассчитанную на поток из 1С.

Бонус: 449 вариантов главной

Когда исключение сняли и главную почистили впервые, удалилось не 2 файла, а 449. Краулер одной соцсети за три дня сделал 1005 запросов к 420 адресам вида /?post_type=…&p=… — для nginx это всё варианты адреса «/», каждый со своей ячейкой. Чистка по пути без параметров вынесла их все разом.

Это ещё один аргумент сравнивать путь без параметров: мусорные варианты от ботов уходят вместе с основным адресом.

Правки на главной появляются не сразу?

Пришлите адрес — проверю, как у вас чистится кэш главной.

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

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

Комментарии

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

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