Как «превентивно» добавить страницы в кэш?

Ссылка скопирована
1 ответ

Есть необходимость добавлять страницы в кэш сразу после публикации, до первого посетителя или поискового бота.

Сайт работает на vps с nginx и fastcgi-кэшем (плагин Nginx Helper)

Какой бы костыль придумать?

Дополнительно:

Ответы:

Предварительно прогревать кэш запросом к новой странице

  • Уточню:
    1. Получить все url сайта (на внутренние страницы).
    2. Пройти скриптом по этим ссылкам.
    ...
    99. Если страница была создана или обновлена > авто-запуск скрипта с заходом на эту страницу.
  • Михаил Р., а есть какие-то готовые решения (плагин или скрипт)?
    Чтобы при массовом добавлении страниц сайт не падал как от ddos)
  • Kuzina_mazina, почему он должен упасть как от ddos?
  • Kuzina_mazina, напишите отдельный вопрос по поводу скрипта для прогрева кэша
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Никита Орлов Ответ

Превентивное добавление страниц в 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);

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

wget --spider --quiet --recursive --no-verbose --level=1 https://example.com/sitemap.xml

Или отдельный скрипт, который читает список URL и делает запросы с паузой. Важно не прогревать админку, поиск, корзину, личный кабинет и URL с параметрами. Также убедитесь, что запросы прогрева не идут с cookie администратора, иначе можно закэшировать неправильную версию.

Итог: для единичной публикации достаточно фонового wp_remote_get(). Для больших сайтов делайте очередь прогрева, лимиты и лог ошибок, чтобы прогрев не превращался в самодельный DDoS по собственному серверу.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно