Как «превентивно» добавить страницы в кэш?
Есть необходимость добавлять страницы в кэш сразу после публикации, до первого посетителя или поискового бота.
Сайт работает на vps с nginx и fastcgi-кэшем (плагин Nginx Helper)
Какой бы костыль придумать?
Дополнительно:
Ответы:
Предварительно прогревать кэш запросом к новой странице
- Уточню:
1. Получить все url сайта (на внутренние страницы).
2. Пройти скриптом по этим ссылкам.
...
99. Если страница была создана или обновлена > авто-запуск скрипта с заходом на эту страницу. - Михаил Р., а есть какие-то готовые решения (плагин или скрипт)?
Чтобы при массовом добавлении страниц сайт не падал как от ddos) - Kuzina_mazina, почему он должен упасть как от ddos?
- Kuzina_mazina, напишите отдельный вопрос по поводу скрипта для прогрева кэша
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Превентивное добавление страниц в fastcgi cache называется прогревом кэша. Самый простой принцип: после публикации или обновления получить URL страницы и сделать к нему HTTP-запрос, чтобы nginx сгенерировал и сохранил кэш до прихода пользователя или бота.
Для одной новой записи можно повеситься на
save_postи отправить неблокирующий запрос:add_action('save_post', function ($post_id) { if (wp_is_post_revision($post_id) || get_post_status($post_id) !== 'publish') { return; } $url = get_permalink($post_id); if (!$url) { return; } wp_remote_get($url, [ 'timeout' => 1, 'blocking' => false, ]); }, 20);
Но для массовой публикации так делать опасно: можно создать большой всплеск запросов. Лучше складывать URL в очередь и прогревать постепенно через WP-Cron или системный cron по 5-20 URL за запуск.
Для всего сайта можно использовать sitemap:
wget --spider --quiet --recursive --no-verbose --level=1 https://example.com/sitemap.xml
Или отдельный скрипт, который читает список URL и делает запросы с паузой. Важно не прогревать админку, поиск, корзину, личный кабинет и URL с параметрами. Также убедитесь, что запросы прогрева не идут с cookie администратора, иначе можно закэшировать неправильную версию.
Итог: для единичной публикации достаточно фонового
wp_remote_get(). Для больших сайтов делайте очередь прогрева, лимиты и лог ошибок, чтобы прогрев не превращался в самодельный DDoS по собственному серверу.