Налаштування Memcached для 1С-Бітрікс
Налаштування Memcached для 1С-Бітрікс
1С-Бітрікс має вбудовану підтримку Memcached через модуль кешування. При правильному налаштуванні кеш компонентів, HTML-сторінок (композитний сайт) і сесії зберігаються в пам'яті, минаючи файлову систему. На сервері з повільними дисками (HDD) різниця між файловим кешем і Memcached — 5–10 разів за часом читання.
Встановлення та базове налаштування
apt install memcached php-memcached
# Конфігурація /etc/memcached.conf
-d # daemon mode
-m 1024 # пам'ять у МБ
-u memcache
-l 127.0.0.1 # лише localhost
-p 11211
-c 1024 # max connections
-I 32m # max item size (для великих об'єктів кешу)
-t 4 # потоки (= кількість ядер)
-I 32m — стандартний ліміт на об'єкт 1 МБ. 1С-Бітрікс кешує HTML-блоки сторінок цілком; сторінка каталогу з 50 товарами в HTML може важити 2–5 МБ. Без збільшення ліміту кеш мовчки не зберігає великі об'єкти.
Підключення в 1С-Бітрікс
У файлі /bitrix/.settings.php (не dbconn.php):
return [
'cache' => [
'value' => [
'type' => 'memcache',
'memcache' => [
'host' => '127.0.0.1',
'port' => '11211',
],
'sid' => 'bitrix_cache',
],
],
];
Або через адміністративний інтерфейс: Налаштування → Налаштування продукту → Кешування — вибрати «Memcache».
Кеш сесій у php.ini:
session.save_handler = memcached
session.save_path = "127.0.0.1:11211"
Кілька серверів Memcached
При кількох нодах застосунку сесії мають зберігатися у спільному Memcached:
// .settings.php з пулом серверів
'memcache' => [
[
'host' => '10.0.0.10',
'port' => '11211',
'weight' => 1,
],
[
'host' => '10.0.0.11',
'port' => '11211',
'weight' => 1,
],
],
Memcached використовує consistent hashing для розподілу ключів по нодах — при додаванні/видаленні ноди перерозподіляється лише частина ключів.
Моніторинг та діагностика
# Базова статистика
echo "stats" | nc 127.0.0.1 11211
# Ключові метрики
echo "stats" | nc 127.0.0.1 11211 | grep -E "curr_items|bytes|get_hits|get_misses|evictions"
evictions > 0 — Memcached витісняє старі дані, щоб звільнити місце для нових. Якщо evictions зростають — збільшуйте -m або аналізуйте, що займає пам'ять.
Hit rate = get_hits / (get_hits + get_misses). Нижче 80% — кеш неефективний: TTL занадто короткий або об'єкти витісняються раніше часу.
# Підрахунок hit rate
hits=$(echo "stats" | nc 127.0.0.1 11211 | grep get_hits | awk '{print $3}')
misses=$(echo "stats" | nc 127.0.0.1 11211 | grep get_misses | awk '{print $3}')
echo "Hit rate: $(echo "scale=2; $hits / ($hits + $misses) * 100" | bc)%"
Порівняння Memcached та Redis для 1С-Бітрікс
| Критерій | Memcached | Redis |
|---|---|---|
| Продуктивність | Швидший для простих get/set | Порівнянно |
| Персистентність | Немає (дані губляться при рестарті) | Є (RDB/AOF) |
| Структури даних | Лише рядки | Рядки, списки, хеші, сети |
| Кластеризація | Немає нативного кластера | Redis Cluster |
| Підтримка Бітрікс | Нативна | Через модуль або кастомний клас |
Для кешу компонентів і HTML — Memcached достатній. Для черг завдань, лічильників, pub/sub — Redis.
Типова проблема: застарілий кеш після оновлень
1С-Бітрікс інвалідує кеш за тегами. При оновленні товару інвалідуються всі кеші, що містять тег цього товару. Якщо інвалідація не працює — перевіряємо, що тег-система правильно налаштована в cache_flags.php:
// bitrix/php_interface/cache_flags.php
$GLOBALS['CACHE_FLAGS'] = [
'iblock_id_list' => true,
'catalog_price' => true,
];







