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



