hostprofi.ru
Подобрать хостинг
Термин·буква O

OPCache

краткое определение

OPCache — встроенное расширение PHP, кеширующее скомпилированный байткод (опкоды) в оперативной памяти. Устраняет повторную компиляцию PHP-файлов при каждом запросе, ускоряя выполнение скриптов в 2–5 раз.

OPCache (Zend OPcache) — расширение PHP, кеширующее байткод скриптов в разделяемой памяти. При первом выполнении PHP-файла интерпретатор компилирует исходный код в опкоды (промежуточные инструкции для Zend Engine). OPCache сохраняет эти опкоды в памяти и возвращает их при последующих запросах, минуя повторный разбор и компиляцию. Для сайта с сотнями PHP-файлов это сокращает нагрузку на CPU на 50–80%.

Как работает

Без OPCache каждый HTTP-запрос проходит полный цикл: PHP читает файл с диска, лексирует исходный код в токены, строит абстрактное синтаксическое дерево (AST), компилирует его в опкоды, и только потом Zend Engine выполняет опкоды. С OPCache шаги 1–3 выполняются один раз при первом запросе; все последующие запросы получают готовые опкоды из RAM-хранилища.

Хранилище опкодов — единый shared memory сегмент, доступный всем воркерам PHP-FPM. Это означает, что кеш общий: первый запрос «прогревает» кеш для всех последующих. Размер хранилища задаётся параметром opcache.memory_consumption (по умолчанию 128 МБ). Для WordPress-проектов рекомендуется 128–256 МБ, для крупных фреймворков (Laravel, Symfony) — 256–512 МБ.

OPCache проверяет актуальность кеша через параметр opcache.validate_timestamps (1 — проверять, 0 — не проверять) и opcache.revalidate_freq (интервал проверки в секундах). На production-серверах устанавливают validate_timestamps=0 для максимальной производительности, а при деплое сбрасывают кеш командой opcache_reset() или перезапуском PHP-FPM.

С PHP 8.0 появилось расширение JIT (Just-in-Time), работающее поверх OPCache: JIT компилирует «горячие» опкоды в нативный машинный код процессора. Для вычислительно интенсивных задач (математика, генерация изображений) JIT даёт дополнительный прирост 10–30%. Для типичных веб-приложений с вводом-выводом JIT почти не влияет на скорость.

История

До OPCache в PHP использовали сторонние кешеры: APC (Alternative PHP Cache, с 2005 года), XCache, eAccelerator. Zend Technologies разработала Zend Optimizer+ и в декабре 2013 года передала его в открытый исходный код под именем OPCache. Начиная с PHP 5.5 (июнь 2013) OPCache включён в состав PHP-дистрибутива и включён по умолчанию. В PHP 7.0 (2015) Zend Engine 3.0 значительно улучшил алгоритм сжатия опкодов. PHP 8.0 (2020) добавил JIT поверх OPCache.

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

opcache.memory_consumption
Размер shared memory в МБ. Для небольших сайтов — 64 МБ, для WordPress — 128–256 МБ, для фреймворков — 256–512 МБ.
opcache.max_accelerated_files
Максимальное количество файлов в кеше. Для WordPress с плагинами — 10 000–20 000. Должно быть простым числом.
opcache.validate_timestamps
0 — отключить проверку меток времени (production), 1 — проверять (development).
opcache.revalidate_freq
Частота проверки изменений файлов в секундах. При validate_timestamps=0 игнорируется.
opcache.interned_strings_buffer
Буфер для интернированных строк в МБ. Рекомендуется 16–64 МБ.

На что обращать внимание

OPCache напрямую влияет на время загрузки страницы: включение OPCache на VPS с PHP-сайтом снижает TTFB на 30–70%. Проверить состояние кеша можно через phpinfo() или скрипт opcache_get_status(). Если параметр opcache_hit_rate ниже 95% — увеличьте memory_consumption или max_accelerated_files.

OPCache совместим с PHP-FPM и mod_php (Apache). При использовании CLI-скриптов (cron-задания) кеш OPCache не разделяется с FPM — у каждого процесса свой кеш. Для CLI-скриптов OPCache менее эффективен.

OPCache кэширует скомпилированный PHP-байткод. Критически важен для производительности WordPress и Битрикса. Работает в связке с PHP-FPM. Инвалидация при деплое: opcache_reset(). Конфигурация в Nginx + PHP стеке критична для производительности. Redis дополняет OPCache для объектного кэша.

Другие термины