Настройка OPcache для 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка OPcache для 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1175
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка OPcache для 1С-Битрикс

Первый запрос к Битрикс-странице — PHP читает, парсит и компилирует десятки файлов ядра. Без OPcache это происходит при каждом запросе. С правильно настроенным OPcache скомпилированный байткод хранится в shared memory — интерпретатор пропускает этап компиляции и время ответа падает в 3–5 раз.

Проблема не в том, чтобы включить OPcache — он включён по умолчанию с PHP 5.5. Проблема в том, что дефолтные параметры рассчитаны на «среднестатистическое» PHP-приложение, а не на Битрикс, где в одном запросе подключается 200–400 файлов.

Диагностика текущего состояния

// Состояние OPcache
$status = opcache_get_status();
echo "Cached files: " . $status['opcache_statistics']['num_cached_scripts'] . "\n";
echo "Cache full: " . ($status['cache_full'] ? 'YES' : 'NO') . "\n";
echo "Hit rate: " . round($status['opcache_statistics']['opcache_hit_rate'], 2) . "%\n";
echo "Memory used: " . round($status['memory_usage']['used_memory'] / 1024 / 1024, 1) . " MB\n";
echo "Memory free: " . round($status['memory_usage']['free_memory'] / 1024 / 1024, 1) . " MB\n";

Если cache_full = YES — OPcache заполнен, новые файлы не кешируются. Если Hit rate ниже 90% — либо памяти мало, либо частые перезапуски (деплой).

Количество PHP-файлов Битрикс на типовом проекте:

find /var/www/bitrix/bitrix -name "*.php" | wc -l
# Обычно 15000–40000 файлов

Правильные параметры OPcache для Битрикс

В файле php.ini или /etc/php.d/10-opcache.ini:

[opcache]
opcache.enable = 1
opcache.enable_cli = 0

; Размер памяти под байткод. Для Битрикс Enterprise — 256M, для Business — 128M
opcache.memory_consumption = 192

; Таблица интернированных строк (имена функций, классов, константы)
opcache.interned_strings_buffer = 16

; Максимум файлов в кеше. Должен быть больше реального числа PHP-файлов
opcache.max_accelerated_files = 32531

; Периодичность проверки изменения файлов на диске (секунды)
; На продакшне ставить 0 с ручным сбросом при деплое
opcache.revalidate_freq = 60

; Не проверять временные метки файлов (максимальная производительность)
; Требует ручного сброса при деплое!
opcache.validate_timestamps = 0

; Оптимизации AST
opcache.optimization_level = 0x7FFEBFFF

; Сохранение кеша между рестартами PHP-FPM через shared memory
opcache.huge_code_pages = 1

; Путь для файлового кеша (резервный, если shared memory переполнена)
opcache.file_cache = /tmp/opcache

; Не разрешать сброс кеша из кода (безопаснее)
opcache.restrict_api = /var/www

validate_timestamps = 0 и деплой

Это самый спорный параметр. При validate_timestamps = 0 OPcache никогда не проверяет, изменился ли файл на диске. Скорость максимальная, но при обновлении кода изменения не применяются до перезагрузки PHP-FPM.

Сброс кеша после деплоя:

# Перезапуск PHP-FPM (надёжно, но секунда простоя)
systemctl reload php8.1-fpm

# Программный сброс через CLI (PHP должен видеть тот же OPcache)
php -r "opcache_reset();"
# Внимание: CLI-процесс использует отдельный OPcache, если php-fpm запущен как демон

# Через HTTP-запрос к специальному скрипту (работает для FPM)
curl -s http://127.0.0.1/opcache_reset.php

Скрипт /var/www/bitrix/opcache_reset.php (доступ только с localhost):

<?php
if ($_SERVER['REMOTE_ADDR'] !== '127.0.0.1') {
    http_response_code(403);
    exit;
}
opcache_reset();
echo "OPcache reset OK\n";

opcache.huge_code_pages на Linux

На Linux с ядром 4.0+ можно разместить кеш в huge pages (2 МБ вместо 4 КБ), что снижает нагрузку на TLB процессора:

# Выделить huge pages
echo 128 > /proc/sys/vm/nr_hugepages

# Добавить в /etc/sysctl.conf для постоянного эффекта
vm.nr_hugepages = 128

При включённом opcache.huge_code_pages = 1 PHP автоматически использует huge pages для кеша. Эффект ощутим на высоконагруженных проектах — снижение CPU на 5–15%.

Мониторинг в продакшне

Встроенная страница статуса OPcache от PHP-group:

# Скачать официальный скрипт
wget https://raw.githubusercontent.com/amnuts/opcache-gui/master/index.php \
  -O /var/www/bitrix/opcache-status.php
# Добавить защиту по IP или basic auth

Метрики для системы мониторинга через opcache_get_status():

  • hit_rate — должен быть 95%+
  • cache_full — если true, увеличить memory_consumption
  • oom_restarts и hash_restarts — если ненулевые, нужна оптимизация параметров