Главная » Производительность » Настройка php.ini и OPcache для Битрикс

Настройка php.ini и OPcache для Битрикс

Настройка PHP для Битрикс: увеличенные лимиты памяти и времени плюс OPcache для ускорения

Значения PHP по умолчанию рассчитаны на скромный сайт. Битрикс к таким не относится: админка потребляет много памяти, обмен с 1С работает долго, а формы настроек передают сотни полей за раз.

Разберём параметры, которые приходится менять почти всегда, и отдельно — OPcache: расширение, дающее заметный прирост скорости практически бесплатно.

Основные параметры

Параметр По умолчанию Для Битрикс Что ломается при нехватке
memory_limit 128M 256M и выше Белый экран на каталоге и в админке
max_execution_time 30 300 Обрыв импорта и обмена
max_input_time 60 300 Обрыв загрузки больших файлов
upload_max_filesize 2M 64M Не загружаются изображения и архивы
post_max_size 8M 64M То же, обрезается тело запроса
max_input_vars 1000 10000 Формы админки сохраняются частично

Три уточнения к таблице.

post_max_size должен быть не меньше upload_max_filesize. Иначе файл нужного размера всё равно не пройдёт: ограничение на тело запроса сработает раньше.

max_input_vars — коварный параметр. При превышении лимита PHP молча отбрасывает лишние поля. Внешне это выглядит так: настройки инфоблока с сотней свойств сохранились, но часть значений пропала. Ошибки при этом нет.

Нехватка памяти проявляется как белый экран. Диагностика описана в статье Белый экран в Битрикс, а сама ошибка — в материале Allowed memory size exhausted.

Где менять

СпособКогда подходит
php.iniСвой сервер, глобальные значения
Пул PHP-FPMРазные настройки для разных сайтов
.htaccessApache или связка Nginx + Apache
Панель хостингаВиртуальный хостинг
ini_set() в кодеТочечно для одной операции

На чистом Nginx с PHP-FPM директивы в .htaccess не работают — это регулярный источник недоумения при переезде с Apache.

Проверить действующие значения проще всего из административной части — там же, где проверка системы. Из кода:

<?php

echo ini_get('memory_limit');
echo ini_get('max_execution_time');
echo ini_get('max_input_vars');

Нужна помощь с Битрикс?





    OPcache

    PHP компилирует код при каждом запросе. OPcache сохраняет результат компиляции в памяти, и при следующем обращении этот шаг пропускается.

    Для Битрикс с его тысячами файлов ядра эффект особенно заметен: время генерации страницы сокращается ощутимо, а настройка занимает пять минут.

    opcache.enable = 1
    opcache.enable_cli = 0
    opcache.memory_consumption = 256
    opcache.interned_strings_buffer = 16
    opcache.max_accelerated_files = 100000
    opcache.revalidate_freq = 60
    opcache.validate_timestamps = 1
    opcache.save_comments = 1
    opcache.fast_shutdown = 1

    Разбор ключевых параметров:

    ПараметрСмысл
    memory_consumption Память под кеш. Для Битрикс 256 МБ — разумный минимум
    max_accelerated_files Сколько файлов кешировать. У Битрикс их десятки тысяч
    validate_timestamps Проверять ли изменения файлов
    revalidate_freq Как часто проверять, в секундах
    save_comments Сохранять комментарии — Битрикс их использует

    Параметр save_comments обязателен: часть механизмов Битрикс читает аннотации в комментариях. При его отключении появляются странные сбои, причину которых искать очень трудно.

    Проверка изменений файлов

    Значение validate_timestamps = 1 означает, что PHP периодически сверяет время изменения файлов. Отключение даёт дополнительный прирост, но тогда любое изменение кода потребует перезапуска PHP-FPM.

    Практический вывод: на боевом сервере со стабильным кодом отключение оправдано, на сервере, где ведётся разработка, — категорически нет. Правки просто не будут применяться, а причина неочевидна.

    Мало памяти под кеш

    Если выделенной памяти не хватает, OPcache начинает вытеснять файлы, и прирост исчезает. Признак — низкий процент попаданий в кеш. Для Битрикс с большим числом файлов 256 МБ обычно достаточно, для крупных проектов с множеством модулей — стоит увеличить.

    Настройки пула PHP-FPM

    Отдельно от самого PHP настраивается количество рабочих процессов:

    pm = dynamic
    pm.max_children = 20
    pm.start_servers = 5
    pm.min_spare_servers = 3
    pm.max_spare_servers = 10
    pm.max_requests = 500

    Число max_children считают из доступной памяти: делят её на средний расход одного процесса. Если поставить слишком много, при наплыве посетителей сервер уйдёт в своп и станет медленнее, чем при меньшем значении.

    Параметр max_requests перезапускает процесс после указанного числа запросов — это страхует от постепенного роста потребления памяти.

    Проверка результата

    1. Убедитесь, что новые значения применились.
    2. Запустите проверку системы — она подсветит несоответствия.
    3. Замерьте время генерации страницы до и после включения OPcache.
    4. Сохраните большую форму настроек инфоблока и проверьте, что всё сохранилось.
    5. Загрузите крупный файл через админку.
    6. Запустите обмен с 1С и убедитесь, что он проходит целиком.

    Сравнение времени генерации удобно делать монитором производительности — он разобран в статье Монитор производительности Битрикс.

    Частые ошибки

    • OPcache не включён. Заметное ускорение доступно бесплатно и не используется.
    • save_comments отключён. Часть механизмов Битрикс ломается непредсказуемым образом.
    • validate_timestamps = 0 на рабочем сервере. Правки кода не применяются, разработчик ищет причину часами.
    • post_max_size меньше upload_max_filesize. Загрузка файлов не работает несмотря на увеличенный лимит.
    • Низкий max_input_vars. Настройки сохраняются частично, без единого сообщения об ошибке.
    • Правки в .htaccess на Nginx. Не применяются вообще.
    • Слишком большой max_children. Сервер уходит в своп под нагрузкой.

    Итог

    Для сайта на 1С-Битрикс шесть параметров PHP почти всегда требуют увеличения относительно значений по умолчанию, причём max_input_vars опаснее остальных: при его нехватке данные теряются молча.

    OPcache — самая выгодная настройка по соотношению усилий и результата. Два условия обязательны: save_comments должен быть включён, а validate_timestamps нельзя отключать на сервере, где кто-то правит код.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    Инструменты
    База знаний