Чтобы сбросить кэш одной страницы, нужно найти её файлы. Соблазн — вычислить ключ самому, взять 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 это всё варианты адреса «/», каждый со своей ячейкой. Чистка по пути без параметров вынесла их все разом.
Это ещё один аргумент сравнивать путь без параметров: мусорные варианты от ботов уходят вместе с основным адресом.
Правки на главной появляются не сразу?
Пришлите адрес — проверю, как у вас чистится кэш главной.
// загружаю комментарии…