Настройка Memcached для 1С-Битрикс
Настройка Memcached для 1С-Битрикс
Битрикс имеет встроенную поддержку Memcached через модуль кэширования. При правильной настройке кэш компонентов, HTML-страниц (композитный сайт) и сессий хранятся в памяти, минуя файловую систему. На сервере с медленными дисками (HDD) разница между файловым кэшем и Memcached — 5–10x по времени чтения.
Установка и базовая настройка
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 МБ. Битрикс кэширует HTML-блоки страниц целиком; страница каталога с 50 товарами в HTML может весить 2–5 МБ. Без увеличения лимита кэш молча не сохраняет крупные объекты.
Подключение в Битрикс
В файле /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 для Битрикс
| Критерий | Memcached | Redis |
|---|---|---|
| Производительность | Быстрее на простых get/set | Сопоставимо |
| Персистентность | Нет (данные теряются при рестарте) | Есть (RDB/AOF) |
| Структуры данных | Только строки | Строки, списки, хэши, сеты |
| Кластеризация | Нет нативного кластера | Redis Cluster |
| Поддержка Битрикс | Нативная | Через модуль или кастомный класс |
Для кэша компонентов и HTML — Memcached достаточен. Для очередей задач, счётчиков, pub/sub — Redis.
Типичная проблема: устаревший кэш после обновлений
Битрикс инвалидирует кэш по тегам. При обновлении товара инвалидируются все кэши, содержащие тег этого товара. Если инвалидация не работает — проверяем, что тег-система правильно настроена в cache_flags.php:
// bitrix/php_interface/cache_flags.php
$GLOBALS['CACHE_FLAGS'] = [
'iblock_id_list' => true,
'catalog_price' => true,
];







