Установка OPcache в Docker контейнер & тюнинг

Назначение: ускорения работы php приложений (особенно актуально при использовании фреймворка в контейнере)

Последовательность действий:

  1. Создать файл opcache.ini, с следующим содержанием:
[opcache]
opcache.enable=1
; 0 - будет проверяться каждый запрос
; 0 не имеет значение если opcache.validate_timestamps=0 (для настройки реального окружения)
opcache.revalidate_freq=0
opcache.validate_timestamps=1
opcache.max_accelerated_files=10000
opcache.memory_consumption=192
opcache.max_wasted_percentage=10
opcache.interned_strings_buffer=16
opcache.fast_shutdown=1
  1. Добавить в файл конфигурации контейнера строки:
RUN docker-php-ext-install opcache

COPY YOU_PATH_TO_FILE/opcache.ini /usr/local/etc/php/conf.d/opcache.ini

Вместо YOU_PATH_TO_FILE использовать путь к ранее созданному файлу с настройками (для Windows этот путь должен быть относительно настроенной общей папки)

Настройка OPcache с помощью конфигурации в контейнере

  1. Изменить содержимое файла opcache.ini на:
[opcache]
opcache.enable=1
opcache.revalidate_freq=0
opcache.validate_timestamps=${PHP_OPCACHE_VALIDATE_TIMESTAMPS}
opcache.max_accelerated_files=${PHP_OPCACHE_MAX_ACCELERATED_FILES}
opcache.memory_consumption=${PHP_OPCACHE_MEMORY_CONSUMPTION}
opcache.max_wasted_percentage=${PHP_OPCACHE_MAX_WASTED_PERCENTAGE}
opcache.interned_strings_buffer=16

opcache.fast_shutdown=1
  1. Добавить в файл конфигурации контейнера строки с настройкой окружения:
ENV PHP_OPCACHE_VALIDATE_TIMESTAMPS="0" \
    PHP_OPCACHE_MAX_ACCELERATED_FILES="10000" \
    PHP_OPCACHE_MEMORY_CONSUMPTION="192" \
    PHP_OPCACHE_MAX_WASTED_PERCENTAGE="10"

RUN docker-php-ext-install opcache

COPY YOU_PATH_TO_FILE/opcache.ini /usr/local/etc/php/conf.d/opcache.ini
  1. В docker-compose.yaml добавить
  environment:
    - PHP_OPCACHE_VALIDATE_TIMESTAMPS=1

(Если не используется docker compose, то заменить

PHP_OPCACHE_VALIDATE_TIMESTAMPS="0"

на:

PHP_OPCACHE_VALIDATE_TIMESTAMPS="1"

Дополнительный тюнинг OPcache

opcache.revalidate_freq [ int ] — срок нахождения кода в кэше (в секундах), до проверки изменения кода. 0 — код будет проверяться при каждом запросе (будет производиться много системных вызовов для этой проверки), стоит использовать при разработке. Не актуально для реального окружения.

opcache.validate_timestamps [ bool ] — когда включено (=1), временная метка файла будет проверяться с частотой opcache.revalidate_freq. Когда выключена (=0), opcache.revaliate_freq игнорируется и код не проверяется на изменения (даже если код изменился, изменения не будут применены до перезапуска php (SIGUSR2)).

Настройку удобно использовать когда обновляется код, так как в процессе обновления могут перекомпоноваться файлы, что может привести к непредсказуемому результату.

opcache.max_accelerated_files [ int ] — количество файлов, одновременно хранящихся в памяти. Важно задавать настройку большую чем количество файлов кодовой базе.

opcache.memory_consumption [ int ] — размер разделяемой памяти в мегабайта. Большее значение следует устанавливать если много кода. Функция opcachegetstatus() позволяет узнать сколько памяти потребляет opcache.

opcache.interned_strings_buffer [ int ] — PHP использует метод, называемый интернированием строк, для повышения производительности (если в коде есть строка «some value» используется несколько раз, внутри PHP сохранит одну неизменяемую переменную для этой строки (при первом обнаружении), а при дальнейшем обнаружении будет использовать указатель на нее). С помощью этого параметра, вместо того, чтобы иметь пул неизменяемых строк для каждого процесса php-fpm, этот параметр использует его для ВСЕХ процессов php-fpm. Это экономит память и повышает производительность, особенно в больших приложениях. Значение устанавливается в мегабайтах, по умолчанию — 4 МБ.

opcache.fast_shutdown [ bool ] — обеспечивает более быстрый механизм вызова деструкторов в вашем коде в конце одного запроса, чтобы ускорить ответ и повторно использовать php-воркеры, чтобы они быстрее были готовы к следующему входящему запросу.