Почему ajax-блокам нужен свой кэш
admin-ajax — это POST с no-store, nginx его не кэширует: сетка на 24 карточки — 2 с, пагинация — 2,2 с. После своего кэша — 0,2 с. Главный приём: чистая функция рендера, которую зовут и ajax, и фоновый воркер.
admin-ajax — это POST с no-store, nginx его не кэширует: сетка на 24 карточки — 2 с, пагинация — 2,2 с. После своего кэша — 0,2 с. Главный приём: чистая функция рендера, которую зовут и ajax, и фоновый воркер.
Версия в ключе — бесплатная инвалидация, но до 3 ГБ сирот в сутки и MISS после каждого сброса. Версии в значении: смена кода — MISS, смена данных — STALE и горячая задача. Версии по разделам и срок жизни 7 дней.
Хост — иначе воркер пишет телефоны основного сайта в ячейки поддомена. Мобильность из User-Agent — строка false прошла isset, и десктоп получал мобильную сетку. Параметры формы — иначе все видят товар первого открывшего.
Воркер в командной строке без HTTPS собирает http-ссылки — карточки без картинок на https-сайте. Та же ошибка в генераторе миниатюр: 47 постеров по http. Чек-лист окружения и почему проверочный скрипт видел 167 промахов из 167.
Переменная запроса из шаблона товара доживала до конца прогона воркера: 134 из 139 ячеек без вкладок, все HIT, сторож доволен. Снимок и восстановление состояния, маркеры по группам и вторая беда — Cannot redeclare по кругу.
Правило «пустое не кэшируем» плюс сторож полноты — замкнутый круг: 2092 из 3118 ячеек залипли в очереди. Пустая вторая страница и товар без допов — законный результат. Признак сбоя — исключение, а не пустота.
Обходчик страниц вынимает из HTML контейнеры блоков с параметрами и пишет их в реестр — охват вырос с «главная и категории» до 1030 ячеек. Все параметры — в разметке, остальное — из реестра живых запросов.
Сверять версию кода, а не наличие: после выката все ячейки на месте, но холодные. LIKE по значению — 10,79 с, время истечения минус срок — 0,05 с с точностью 99,7 %. Перечень теми же функциями, что очередь: 1202 против 1156 — это дыра.
Прогрев сам продлевал ячейкам жизнь: 31 115 из 31 115 «тронуты за сутки». Когда отметки перестали врать — 24 264 холодных, 88 % из них один блок. И почему мы греем всё видимое, хотя посетители трогают 55 ячеек в час.
Волны обмена каждые ~10 минут заново ставили первые страницы категорий вперёд — вторая–шестая не рендерились никогда, MISS 0,9–2,3 с спустя часы. Резерв в бюджете прогона под дальние страницы и порядок приоритетов.
Устаревшее можно отдать мгновенно, отсутствующее — нет. Фильтр на 22 категории: 18 из 22 MISS по 1,93 с. Засев по категориям на редких событиях, точечный — на обмене, и почему счётчику терминов верить нельзя. Сортировки не греем.
Открытые DevTools сузили окно — фронт прислал другие параметры, и прогретый блок дал MISS прямо на демо. Не тот тип записей, не та группировка (259 товаров — 5 страниц на компьютере и 8 на телефоне). Параметры — из серверной разметки.
Новый размер миниатюры ещё не нарезан — в кэш блоков легли оригиналы: 74 картинки, 26,6 МБ, мобильная главная 15,75 МБ. Файловый маркер от генератора и крон-сторож: 74 → 9 → 0, главная 15,75 → 2,93 МБ.
Таблица опций — 88 % базы, 3,24 ГБ при 739 МБ полезных. Чистка и OPTIMIZE: база 3,7 ГБ → 1 ГБ. Redis с noeviction, версией кода в имени ключа и сжатием в 27,6 раза, откат на временные записи и виджет, который врал в 8 раз.
При noeviction старые поколения не «истекут сами» — они съедят память, и Redis откажет в записи. SCAN с UNLINK: 45 611 ключей за 0,32 с, 252 → 14,65 МБ. Формула памяти на два поколения: 32 269 ячеек — 181 МБ, лимит 1 ГБ.
Кольцо на одном CSS-градиенте, бегунки прогресса по видам блоков, отдельный бегунок горячих задач с дневным счётчиком. Чего не показывать: долю места и счётчик круга, который всегда 0. Пауза на скрытой вкладке.
Токен wp_create_nonce живёт сутки, разметка формы в кэше — дольше. 6 мёртвых токенов из 18 ячеек форм, мобильные страдают вдвое чаще. Как найти без отправки заявки, и решение: пустое поле, токен с некэшируемого адреса при фокусе и повтор.
Почти все 180 мс — вход в WordPress, а не рендер, поэтому прогрев не помогает. Лечит фронт: параллельная загрузка, запрос вместе с анимацией, промис на вкладку и загрузка по наведению с форой 300–800 мс. И почему не грузить формы всем.
$ tail -f /blog
Пишу разборы по скорости сайтов, кэшу и разработке — на живых проектах и с цифрами. Подпишитесь, и ссылка на новую статью придёт сразу после выхода. Без рекламы и спама, отписаться — в один клик.
или на почту