
💡 Как уменьшить нагрузку на сервер и ускорить WordPress с помощью Memcached
Сайт на WordPress без кеширования напоминает двигатель, который заново прогревается перед каждым светофором. Посетитель заходит на страницу, PHP собирает её с нуля, дёргая базу данных по 30-60 раз. Десять посетителей одновременно, триста запросов. Пятьдесят, лавина, от которой сервер роняет соединения быстрее, чем вы дописываете команду в консоли.
Проблема не в WordPress как таковом. Динамическая сборка страниц по умолчанию расточительна по определению: так работают почти все CMS. Решение проверено годами эксплуатации на highload-проектах, объектное кеширование в оперативной памяти через Memcached. Правильно настроенный слой Memcached превращает сервер из задыхающегося при полусотне одновременных пользователей в машину, которая держит сотни без дрогнувшей миллисекунды ответа.
Разберём полный цикл настройки: от установки демона до нагрузочного теста, который покажет разницу в цифрах. Все команды протестированы на Ubuntu 22.04/24.04, AlmaLinux 9 и совместимы с PHP 8.2-8.5.
💡 Быстрый обзор:
- Установите демон Memcached и привяжите его к localhost для безопасности
- Скомпилируйте PHP-расширение memcached через PECL под вашу версию PHP
- Подключите object-cache.php от Automattic в директорию wp-content
- Установите Batcache и настройте advanced-cache.php для страничного кеша
- Проверьте заголовки ответа через DevTools браузера
- Запустите нагрузочный тест через k6 и сравните результаты до и после
Что такое Memcached и зачем он вашему WordPress
Memcached, это демон, который держит данные и объекты в оперативной памяти сервера. В отличие от файлового кеша (WP Super Cache, W3 Total Cache, WP Rocket), который пишет готовый HTML на диск, Memcached работает уровнем ниже: результаты запросов к базе данных, собранные меню, виджеты, настройки сайта оседают в RAM и достаются за микросекунды без повторной сборки.
На практике картина такая. Типичная страница WordPress без кеширования делает 30-60 запросов к MySQL. При 50 одновременных посетителях база получает от полутора до трёх тысяч запросов, и процессор уходит в отказ. Memcached перехватывает подавляющее большинство этих запросов на уровне оперативной памяти: база отдыхает, процессор свободен, сервер отвечает мгновенно.
Технически Memcached оперирует парами ключ-значение. Ключ, это хеш SQL-запроса, значение, сериализованный результат. Когда WordPress в очередной раз собирает ту же страницу, он сначала спрашивает Memcached: «Есть такой ключ?», и почти всегда получает готовый ответ без единого обращения к диску.
Технология появилась в 2003 году внутри LiveJournal как решение проблемы диких нагрузок на базу данных. Сегодня на Memcached держатся WordPress.com, Wikipedia, Twitter и тысячи высоконагруженных проектов. Взрослая, стабильная и предсказуемая, ровно то, что нужно продакшену.
Установка демона Memcached
Рассмотрим два основных сценария: Ubuntu (22.04/24.04) с apt и AlmaLinux / Rocky Linux 9 с dnf. Адаптируйте команды под ваш дистрибутив.
На Ubuntu:
1 sudo apt update && sudo apt install memcached libmemcached-tools -y
На AlmaLinux / Rocky Linux 9:
1 sudo dnf install memcached libmemcached -y
После установки демон стартует автоматически. Проверьте:
1 systemctl status memcached
По умолчанию Memcached слушает порт 11211 на всех сетевых интерфейсах. Это дыра в безопасности: ваш кеш доступен любому, кто достучится до этого порта извне. Поэтому первым делом привяжите демон к localhost.
Откройте конфигурационный файл (/etc/memcached.conf на Ubuntu, /etc/sysconfig/memcached на AlmaLinux) и убедитесь, что строка -l 127.0.0.1 присутствует и не закомментирована. Перезапустите демон:
1 sudo systemctl restart memcached
Сборка PHP-расширения через PECL
Демон сам по себе WordPress не ускорит, нужен PHP-клиент, который научит PHP общаться с Memcached. Ставьте расширение memcached, обратите внимание: именно memcached (с буквой d), не memcache. Второе удалено из PHP начиная с версии 8.0 и не должно использоваться.
На Ubuntu сначала установите инструменты сборки. Подставьте свою версию PHP: php8.4-dev, php8.3-dev или php8.2-dev:
1 sudo apt install php8.4-dev php-pear libmemcached-dev pkg-config make gcc -y
Затем соберите расширение:
1 sudo pecl install memcached
На AlmaLinux / Rocky Linux 9 набор похожий:
1 sudo dnf install php-devel php-pear libmemcached-devel make gcc -y 2 sudo pecl install memcached
После сборки расширение нужно зарегистрировать в PHP. Создайте INI-файл:
1 echo "extension=memcached.so" | sudo tee /etc/php/8.4/mods-available/memcached.ini 2 sudo phpenmod memcached
На AlmaLinux путь будет другим: /etc/php.d/memcached.ini.
Если вы работаете в Plesk Obsidian, команда перечитывания PHP-обработчиков после установки расширения:
1 plesk bin php_handler --reread
Проверьте, что расширение загрузилось:
1 php -m | grep memcached
Вывод должен содержать memcached. Если пусто, проверьте путь к INI-файлу и перезапустите PHP-FPM: sudo systemctl restart php8.4-fpm.
Подключение WordPress к Memcached
Демон установлен, PHP-расширение загружено. Теперь нужно подключить WordPress к Memcached на уровне приложения.
Стандарт де-факто сегодня, официальный дроп-ин от Automattic: wp-memcached на GitHub. Его пишут те же разработчики, что поддерживают Batcache и WordPress.com, он корректно работает с PHP 8.x (включая 8.4 и 8.5).
Скопируйте файл object-cache.php из репозитория в папку /wp-content/ вашего сайта. WordPress автоматически обнаружит его и начнёт использовать Memcached как бекенд объектного кеша, без дополнительных плагинов.
Если порт Memcached отличается от стандартного (11211), добавьте в wp-config.php:
1 $memcached_servers = array( 2 array( '127.0.0.1', 11211 ) 3 );
Кеширование страниц: Batcache
Объектный кеш, половина дела. Вторая половина: кеширование готовых HTML-страниц, чтобы PHP вообще не запускался для анонимных посетителей. Здесь в дело вступает Batcache, плагин от Automattic, который хранит сгенерированные страницы в том же Memcached.
Принцип работы прост. Посетитель заходит на сайт, Batcache проверяет, есть ли в Memcached готовая HTML-копия этой страницы. Если есть и она не протухла, отдаёт мгновенно, минуя всю цепочку PHP и MySQL. Если нет или посетитель авторизован, страница генерируется заново и попутно сохраняется в кеш для следующих визитов.
Установка:
Скачайте архив с wordpress.org, распакуйте и загрузите файл advanced-cache.php в корень /wp-content/. Затем откройте wp-config.php и добавьте строку, которая включает кеширование:
1 define( 'WP_CACHE', true );
Файл batcache.php отправьте в /wp-content/plugins/ и активируйте плагин в админке.
Внутри advanced-cache.php, десяток настроек под комментариями. Самые полезные: max_age (время жизни страницы в секундах, по умолчанию 300, 5 минут), seconds (интервал между регенерациями одного URL), unique (не кешировать разные User-Agent по отдельности). Для большинства сайтов значения по умолчанию подходят; трогайте, только когда поймёте зачем.
Важный нюанс: убедитесь, что define( 'WP_CACHE', true ) стоит ДО строки require_once ABSPATH . 'wp-settings.php' в wp-config.php. Если поставить после, кеширование не включится, и WordPress молча это проигнорирует.
Видео: установка и настройка от начала до конца
Теория, это база, но консольные команды лучше один раз увидеть. В этом видео, полный цикл настройки объектного кеширования WordPress с Redis и Memcached, от установки демона до проверки результата:
Проверка работы Memcached
Лучший тест, практический. Добавьте кастомный заголовок в advanced-cache.php, чтобы визуально видеть: страница отдана из кеша или сгенерирована заново.
Найдите в advanced-cache.php строку:
1 var $headers = array();
Замените на:
1 var $headers = array( 'memcached' => 'activated' );
Теперь откройте DevTools в браузере (F12), вкладка Network, и несколько раз перезагрузите страницу. В Response Headers появится поле memcached: activated, значит, Batcache отработал и страница ушла клиенту напрямую из RAM.
Дополнительный способ, командная строка сервера. Посмотрите статистику демона:
1 echo "stats" | nc 127.0.0.1 11211
В выводе ищите get_hits и get_misses. Если get_hits растёт при обновлении страниц сайта в браузере, Memcached исправно отдаёт закешированные объекты.
Нагрузочное тестирование: цифры, а не ощущения
Настоящую пользу Memcached показывает под давлением. Оригинальный тест на сервере с 1 ядром и 512 МБ памяти дал впечатляющий контраст: без Memcached сервер рухнул через 15 секунд при 50 одновременных пользователях, с Memcached, держал 400+ пользователей 50 секунд без единой ошибки. Это не магия, а физика: когда процессор не тратит такты на повторную сборку одних и тех же страниц, он обслуживает новых посетителей.
Для самостоятельного тестирования сегодня используют современные инструменты. Один из самых удобных, k6 от Grafana (открытый исходный код, запуск одной командой). Простейший тест:
1 k6 run --vus 100 --duration 30s http://your-site.com/
100 виртуальных пользователей в течение 30 секунд. Сравните результаты с выключенным Batcache (закомментируйте WP_CACHE) и с включенным, разница в количестве успешных ответов и медианной задержке будет исчисляться порядками.
Для быстрой проверки без установки софта подойдёт веб-инструмент Loader.io, бесплатный тариф даёт до 10 000 клиентов в тесте, этого с головой хватит для большинства сайтов.
Redis или Memcached: что выбрать
Вопрос, который неизбежно возникает: почему не Redis? Оба, in-memory key-value хранилища, оба работают с WordPress через дроп-ины. Короткий ответ: для чистого кеширования Memcached проще и быстрее, для всего остального, Redis.
Сравним по существу:
Критерий | Memcached | Redis |
|---|---|---|
Модель данных | Только строки | Строки, списки, множества, хеши, геоданные, pub/sub |
Многопоточность | Все ядра из коробки | Преимущественно однопоточный |
Персистентность | Нет (чистый in-memory) | RDB/AOF - сохранение на диск |
WordPress-экосистема | Automattic/wp-memcached + Batcache | Redis Object Cache (400 000+ установок) |
Сложность настройки | Минимальная | Чуть выше |
Сброс кеша при рестарте | Полный (но прогревается за минуты) | Можно сохранить |
Для кеширования объектов WordPress строкового key-value достаточно с запасом. Лишние типы данных Redis здесь не нужны. На операциях get/set оба упираются в пропускную способность сети, а не в процессор, при прочих равных паритет. Memcached выигрывает в многопоточности: он использует все ядра процессора из коробки, тогда как Redis сохраняет преимущественно однопоточную архитектуру.
Redis стоит выбрать, если вы параллельно храните сессии, очереди задач или нуждаетесь в персистентности. Для задачи «ускорить WordPress и разгрузить базу» Memcached даёт результат быстрее и с меньшим количеством подвижных частей.
⁉️🤔 Частые вопросы
Нужен ли Memcached на shared-хостинге?
На большинстве shared-хостингов Memcached недоступен: провайдеры не дают доступ к демону на уровне сервера. Но если ваш тариф включает VPS или выделенный сервер, установка занимает 10-15 минут и даёт один из самых заметных приростов скорости среди всех оптимизаций WordPress. Проверьте возможности тарифа в панели управления или уточните у поддержки хостинга.
Batcache или WP Rocket, что лучше?
WP Rocket, комбайн, который делает и страничный кеш (файловый), и оптимизацию CSS/JS, и ленивую загрузку. Batcache, узкий инструмент именно для Memcached-кеширования страниц. Они не конкурируют, а дополняют друг друга: Batcache работает на уровне сервера и отдаёт страницы без запуска PHP, WP Rocket, на уровне приложения. На практике часто используют оба: Batcache для анонимных посетителей, WP Rocket для тонкой оптимизации.
Как сбросить кеш Memcached?
Самый простой способ, перезапустить демон:
sudo systemctl restart memcached. Кеш очистится полностью и начнёт прогреваться заново при следующих визитах. Для точечной очистки используйте плагин Query Monitor: он показывает содержимое объектного кеша и позволяет сбрасывать отдельные ключи. Есть и консольный вариант:echo "flush_all" | nc 127.0.0.1 11211.
Почему после установки object-cache.php сайт не ускорился?
Самая частая причина, расширение PHP не загружено. Проверьте
php -m | grep memcached. Если вывод пустой, проверьте путь к INI-файлу и перезапустите PHP-FPM. Вторая частая причина:object-cache.phpне скопирован в/wp-content/или скопирован с ошибкой прав доступа (должен читаться пользователем, от которого работает PHP). Третья: Memcached-демон не запущен,systemctl status memcached.
Memcached конфликтует с OPcache?
Нет, это разные уровни. OPcache кеширует скомпилированный байт-код PHP, он ускоряет запуск самого интерпретатора. Memcached кеширует данные приложения: результаты запросов к базе. Они работают на разных этапах обработки запроса и отлично дополняют друг друга. На продакшене рекомендуется использовать оба.
Можно ли использовать Memcached на нескольких серверах?
Да, это один из главных сценариев. В конфигурации
$memcached_serversможно перечислить несколько IP-адресов демонов Memcached, клиент автоматически распределит ключи между ними. Для WordPress за этим следит дроп-инobject-cache.php: он поддерживает пул серверов из коробки.
Ставить ли Memcached на ваш сервер
Установка Memcached, не панацея, а один из самых эффективных шагов в оптимизации WordPress. Если сайт работает на VPS или выделенном сервере и вы хотите, чтобы он держал кратный рост трафика без замены железа, ставьте. Десять-пятнадцать минут работы в консоли, и база данных перестаёт быть узким горлышком.
Если сайт на shared-хостинге без доступа к демону, рассмотрите Redis (его чаще предоставляют) или файловый кеш через WP Rocket. А если вы уже на VPS, откройте терминал и пройдите шаги из быстрого обзора выше. Результат увидите в первом же нагрузочном тесте.



