Кэш на неделю и живые данные кажутся несовместимыми: остатки на складе меняются каждый час, редактору нужна кнопка «изменить», счётчик просмотров растёт. Решение во всех случаях одно — HTML одинаковый для всех, а живое дорисовывается отдельно.
Это десятая часть цикла «Кэш страниц без MISS».
Остатки из 1С
В каталоге наличие и остатки обновляются обменом с 1С. Если выводить их в HTML, каждый обмен должен сбрасывать страницы — а это волны сбросов по всему каталогу. Мы сделали иначе:
- в HTML товара — пустой слот под наличие;
- скрипт после загрузки запрашивает статус у отдельного адреса API;
- у этого адреса свой короткий кэш в nginx на 30 секунд (так называемый микрокэш): сотня посетителей за полминуты даёт один запрос к PHP;
- запись остатков обменом не сбрасывает кэш страниц вообще.
location = /wp-json/stock/v1/status {
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 30s;
# остальное — как у обычного PHP
}
При переходе на кэш на неделю этот адрес не трогайте: менять надо только общее правило для страниц.
Кнопки для редактора
Залогиненные идут мимо кэша, поэтому серверу можно добавить им класс на body. Сами кнопки «изменить», ссылки в админку и подсказки дорисовывает скрипт, который подгружается отдельно только при этом классе. Данные для кнопок — в data-*-атрибутах общей разметки, одинаковой для всех.
Анонимный HTML не меняется ни на байт, а редактор видит свою панель.
Просмотры и лайки
Счётчик просмотров — ajax-запрос после загрузки (почему не кукой при рендере — седьмая часть). Лайк — тоже ajax; после него сервер чистит и сразу прогревает страницу, чтобы общее число обновилось для всех (восьмая часть).
Схема в одну строку
Сервер рисует то, что одинаково для всех. Всё, что у каждого своё или меняется чаще кэша, — слот в разметке плюс отдельный запрос.
Нужен кэш, но на страницах живые данные?
Пришлите адрес — подскажу, что вынести в отдельные запросы.
// загружаю комментарии…