27 апреля 2021 года прошёл пятый митап технической серии в латвийской WordPress группе. Митап был посвящён теме «Практика объектного кеширования в WordPress». Доклад осветил различные виды кеширования и теорию объектного кеширования, с примерами практического применения в WordPress. Материалы митапа доступны для скачивания по ссылкам внизу этой статьи.
В начале доклада кратко рассмотрены существующих методах кеширования: страничное кеширование, CDN, Opcode cache, объектное. Далее, даны пояснения о сути объектного кеширования и его предназначении — сохранении результатов ресурсоёмких операций. Указаны два способа сохранения таких результатов — в виде простого массива «ключ-значение» в памяти php, или в in-memory базе данных. Особый акцент сделан на том, что в ядре WordPress практически все сущности закешированы.
Докладчик показал, как устроен объектный кеш внутри ядра WordPress и продемонстрировал, что скорость показа простой страницы блога уменьшается примерно в пять раз при полном отключении объектного кеша.
Далее, дано разъяснение отличий непостоянного и постоянного объектного кеширования. Указано, что для постоянного объектного кеша используются in-memory базы данных такие, как Memcached и Redis. Докладчик привёл и пояснил сравнительную таблицу характеристик Redis и Memcached, акцентировав внимание на том, что решающим преимуществом Redis для WordPress является наличие специализированных плагинов.
Дополнительно, докладчик рассмотрел вопрос установки пакета Redis на сервер и настройки плагина для WordPress. Также, он дал пояснения того, как плагин подменяет функционал объектного кеша в ядре WordPress.
Практика объектного кеширования в WordPress — примеры применения
Рассмотрено 4 практических примера — два среднего уровня сложности, и два — для продвинутых девелоперов. Для первого и второго примера докладчик подготовил демонстрационный плагин, ссылка имеется в презентации.
Первый пример рассматривает кеширование медленных запросов в базу. Показан пример страницы с двумя тяжёлыми запросами в базу. В результате непостоянного кеширования остаётся только один запрос в базу. После подключения постоянного кеша медленные запросы в базу не выполняются вовсе. Однако, это создаёт трудности при обновлении сущностей, информация о которых запрашивается (товары). Докладчик сделал основной акцент на то, что при применении постоянного объектного кеша необходимо вовремя инвалидировать кеш (при обновлении товара). Показан пример, как это можно сделать — и результат на тестовом сайте.
Второй пример посвящён кешированию запросов к удалённым API. Показано, что наиболее подходящим методом кеширования является временная опция (transient). Докладчик подчеркнул, что такие опции хранятся не только в базе, но и в объектном кеше, что существенно ускоряет работу сайта при наличии постоянного объектного кеша.
Третий пример показал проблему, возникшую при кешировании внутренних объектов плагина WPML. Быстро растущий размер кеша потребовал создать код, ограничивающий размер данных, сохраняемых в кеше, чтобы не вызвать проблемы с нехваткой памяти.
Четвёртый пример посвящён оптимизации ядра WordPress — кешированию запросов пользовательской информации через WP_User_Query. Показано, что на сайте с большим количеством пользователей (на примере 250,000), запросы ядра к WP_User_Query существенно замедляют работу некоторых страниц в консоли сайта. Показан плагин кеширования, который уменьшает время загрузки страницы All Posts с 40 секунд до 0.5 секунды. Ссылка на репозиторий плагина имеется в презентации.
В заключение (как и в ходе доклада) были даны ответы на вопросы.
Скачать презентацию митапа «Практика объектного кеширования в WordPress» можно здесь. Запись митапа доступна ниже.