Memcached как объектный кэш WordPress
Memcached как объектный кэш WordPress
Memcached — классический кэш в ОЗУ: проще Redis, многопоточный, без персистентности. Для объектного кэша WordPress на одном сервере возможности сравнимы с Redis. Здесь — замер трёх состояний на живом сайте и две ловушки, из-за которых связка не заработала «из коробки».
Три состояния объектного кэша (Сайт №1, nginx + PHP 8.5 + MySQL локально)
Один сайт, три состояния объектного кэша, одинаковая нагрузка ab -n 300 -c 10 (учётный прогон после прогревочного) + серия одиночных запросов, всё в одном часовом окне. Экран согласия отключает кэш страниц (DONOTCACHEPAGE), поэтому сравнивается именно объектный кэш — единственный вид кэширования, работающий при таком гейте.
| Параметр | Без объектного кэша | Redis (база 0) | Memcached |
|---|---|---|---|
| Запросов/сек | 5,09 | 5,71 (+12 %) | 6,03 (+18 %) |
| Медиана запроса (ab) | 1 549 мс | 1 403 мс | 1 305 мс |
| TTFB главной, одиночные | 0,18–0,23 с | 0,18–0,24 с | 0,17–0,20 с |
Redis и Memcached в пределах разброса дают одно и то же: +10–20 % RPS под нагрузкой при неизменном одиночном TTFB (MySQL на локальном NVMe и так быстр, оставшееся время — исполнение PHP). Выбор между бэкендами — не про скорость.
Как подружить WordPress с Memcached: два плагина и две ловушки
Демон memcached и новое PHP-расширение memcached на сервере были с подготовки окружения. Связка с WordPress при этом не заработала «из коробки» — по одной ловушке на каждый плагин:
- Плагин Automattic «Memcached» внутри использует старое расширение
Memcache(new Memcache()), а не новоеMemcached. Старого в Debian 13 для PHP 8.5 нет (php-memcacheв репозитории отсутствует) — включение его дропина даёт фатал «класс не найден» и лежащий сайт (при тесте: 295 из 300 запросов отказом). - Memcached Redux написан под новое расширение и работает. Вторая ловушка: сам плагин активировать нельзя — его
object-cache.phpлежит прямо в папке плагина, при активации WordPress подгружает этот файл и падает с фаталомCannot redeclare wp_cache_add(). Рабочая схема — плагин установлен, но не активирован, дропин копируется вручную:
wp plugin install memcached-redux # БЕЗ --activate
cp wp-content/plugins/memcached-redux/object-cache.php wp-content/
chown <владелец-сайта> wp-content/object-cache.php
Дальше WordPress кладёт данные в memcached прозрачно для плагинов и темы. Проверка, что кэш реально работает — счётчики демона (echo stats | nc 127.0.0.1 11211): за час под нагрузкой 75 712 чтений, из них 73 373 попаданий — hit rate 96,9 %; 1 011 ключей, 0 вытеснений, ~1 МБ занято из 64 МБ лимита. Демон ни разу не потребовал внимания: память не переполняется, ключи инвалидируются при обновлении контента.
Когда Memcached имеет смысл
- Несколько серверов приложения с общим кэшем (memcached легко масштабируется на несколько нод, Redis на этом уровне требует настройки репликации/Sentinel).
- Строгие требования к многопоточности на многоядерных машинах.
- Во всех остальных случаях на одном сервере Redis и Memcached равнозначны — в замере выше разница в пределах погрешности. Решают другие факторы: персистентность, структуры данных и удобные wp-cli-команды у Redis против многопоточности и простоты у memcached.
Ссылки
- Обзор кеширования WordPress: шесть режимов
- Объектный кэш Redis для WordPress
- WP-Optimize — чистка базы + кэш страниц в одном плагине
