Если ваш PHP-сайт работает медленно, а сервер "задыхается" под нагрузкой, вероятно, вы упускаете один из самых мощных инструментов оптимизации — OPcache. Эта встроенная в PHP функция кэширования байт-кода способна ускорить выполнение скриптов в 2-10 раз, но большинство разработчиков используют её с настройками по умолчанию, оставляя на столе огромный потенциал производительности. В этом руководстве мы разберём, как правильно настроить OPcache для разных типов проектов.
Что такое OPcache и почему он так важен?
Каждый раз, когда выполняется PHP-скрипт, интерпретатор должен его прочитать, скомпилировать в байт-код (промежуточное представление), а затем выполнить. OPcache сохраняет скомпилированный байт-код в оперативной памяти, полностью исключая этап компиляции при повторных запросах. Представьте, что вместо того чтобы каждый раз заново переводить книгу с иностранного языка, вы просто читаете готовый перевод.
Начиная с PHP 5.5, OPcache входит в стандартную поставку PHP и включён по умолчанию во многих конфигурациях, но часто требует тонкой настройки.
Основные директивы конфигурации OPcache
Настройки OPcache находятся в файле php.ini. Давайте разберём ключевые параметры, которые действительно влияют на производительность.
Выделение памяти (opcache.memory_consumption)
Это самый важный параметр. По умолчанию выделяется всего 64 МБ — этого катастрофически мало для современных приложений. Формула для расчёта: общее количество файлов × средний размер файла × 1.5.
- Для небольшого сайта (до 100 файлов): 128-256 МБ
- Для среднего проекта (CMS типа WordPress): 256-512 МБ
- Для крупного фреймворка (Laravel, Symfony): 512 МБ — 1 ГБ
Проверить заполненность памяти можно через phpinfo() или специальные скрипты мониторинга. Если память заполнена на 90% и более — увеличивайте opcache.memory_consumption.
Максимальное количество файлов (opcache.max_accelerated_files)
Определяет, сколько файлов может храниться в кэше. Значение по умолчанию (2000) недостаточно для проектов с большим количеством файлов. Установите значение чуть больше фактического количества PHP-файлов в проекте.
Проверка изменений (opcache.validate_timestamps)
При значении 1 OPcache будет проверять, изменились ли файлы, с определённой частотой (opcache.revalidate_freq). На продакшене рекомендуется установить 0 и сбрасывать кэш через механизм развёртывания (deploy scripts). На разработке — всегда 1.
Продвинутая настройка для разных сценариев
Настройка для высоконагруженного продакшена
- opcache.memory_consumption = 512
- opcache.interned_strings_buffer = 16
- opcache.max_accelerated_files = 20000
- opcache.validate_timestamps = 0
- opcache.save_comments = 0 (осторожно, ломает некоторые библиотеки!)
- opcache.fast_shutdown = 1
Настройка для среды разработки
Здесь приоритет — скорость обновления кода, а не максимальная производительность.
- opcache.validate_timestamps = 1
- opcache.revalidate_freq = 2
- opcache.enable_cli = 1 (если используете CLI-скрипты)
Мониторинг и отладка
Не настраивайте "на глаз". Используйте встроенные инструменты:
- Функция opcache_get_status() — возвращает детальную статистику
- opcache_get_configuration() — текущие настройки
- Визуальные инструменты типа Opcache GUI или CacheTool
Обращайте внимание на метрики: hit rate (должен быть 95%+), memory usage, number of cached scripts.
Распространённые ошибки и их решение
Если после обновления кода изменения не применяются, выполните opcache_reset() через веб-интерфейс или консоль, либо перезапустите PHP-FPM/Apache.
Проблема: "Сайт работает медленно, хотя OPcache включён". Возможные причины:
- Недостаточно памяти (скрипты вытесняются из кэша)
- Слишком низкое значение max_accelerated_files
- Частая проверка timestamp на продакшене
Интеграция с системами развёртывания
При opcache.validate_timestamps=0 необходимо сбрасывать кэш при каждом деплое. Добавьте в скрипт развёртывания:
curl -s http://localhost/opcache-reset.php
Или через консоль: php -r "opcache_reset();"
FAQ — Часто задаваемые вопросы
Как проверить, включён ли OPcache?
Создайте файл phpinfo.php с содержимым <?php phpinfo(); ?> и найдите в выводе раздел "Zend OPcache".
Какие значения memory_consumption оптимальны для WordPress?
Для типичного сайта на WordPress с 30-50 плагинами достаточно 256 МБ. Для крупных порталов — 512 МБ.
Почему OPcache не ускоряет выполнение скриптов в 10 раз?
OPcache устраняет только накладные расходы на компиляцию. Если "узкое место" в базе данных или медленной логике — ускорение будет минимальным.
Нужно ли очищать кэш вручную?
На продакшене — только при развёртывании новой версии. На разработке — при изменении файлов (если validate_timestamps=0).
OPcache совместим со всеми PHP-фреймворками?
Да, абсолютно со всеми. Проблемы могут возникнуть только с очень старыми или экзотическими библиотеками, которые используют рефлексию.