Skip to content

Всё для WordPress, веб-разработки — и не только

💡 Как уменьшить нагрузку на сервер и ускорить WordPress с помощью Memcached

💡 Как уменьшить нагрузку на сервер и ускорить 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:

1sudo apt update && sudo apt install memcached libmemcached-tools -y

На AlmaLinux / Rocky Linux 9:

1sudo dnf install memcached libmemcached -y

После установки демон стартует автоматически. Проверьте:

1systemctl status memcached

По умолчанию Memcached слушает порт 11211 на всех сетевых интерфейсах. Это дыра в безопасности: ваш кеш доступен любому, кто достучится до этого порта извне. Поэтому первым делом привяжите демон к localhost.

Откройте конфигурационный файл (/etc/memcached.conf на Ubuntu, /etc/sysconfig/memcached на AlmaLinux) и убедитесь, что строка -l 127.0.0.1 присутствует и не закомментирована. Перезапустите демон:

1sudo 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:

1sudo apt install php8.4-dev php-pear libmemcached-dev pkg-config make gcc -y

Затем соберите расширение:

1sudo pecl install memcached

На AlmaLinux / Rocky Linux 9 набор похожий:

1sudo dnf install php-devel php-pear libmemcached-devel make gcc -y
2sudo pecl install memcached

После сборки расширение нужно зарегистрировать в PHP. Создайте INI-файл:

1echo "extension=memcached.so" | sudo tee /etc/php/8.4/mods-available/memcached.ini
2sudo phpenmod memcached

На AlmaLinux путь будет другим: /etc/php.d/memcached.ini.

Если вы работаете в Plesk Obsidian, команда перечитывания PHP-обработчиков после установки расширения:

1plesk bin php_handler --reread

Проверьте, что расширение загрузилось:

1php -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 и добавьте строку, которая включает кеширование:

1define( '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 строку:

1var $headers = array();

Замените на:

1var $headers = array( 'memcached' => 'activated' );

Теперь откройте DevTools в браузере (F12), вкладка Network, и несколько раз перезагрузите страницу. В Response Headers появится поле memcached: activated, значит, Batcache отработал и страница ушла клиенту напрямую из RAM.

Дополнительный способ, командная строка сервера. Посмотрите статистику демона:

1echo "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 (открытый исходный код, запуск одной командой). Простейший тест:

1k6 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, откройте терминал и пройдите шаги из быстрого обзора выше. Результат увидите в первом же нагрузочном тесте.