OPcache: кэширование байткода
Включайте и настраивайте OPcache, чтобы устранить издержки повторной компиляции скриптов
«OPcache: кэширование байткода» — бесплатный урок PHP Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Как обычно работает PHP
Без OPcache каждый запрос заставляет PHP выполнить следующие действия: прочитать файл .php с диска, разобрать его в AST, скомпилировать в опкоды (байт-код), а затем выполнить опкоды.
Что делает OPcache
OPcache хранит скомпилированные опкоды в общей памяти. При последующих запросах PHP пропускает этапы разбора и компиляции и сразу переходит к выполнению.
Влияние на производительность
OPcache обычно повышает пропускную способность приложений на PHP в 2–5 раз без необходимости изменять код.
Включение OPcache
OPcache входит в состав PHP 5.5+ и во многих дистрибутивах включён по умолчанию. Проверьте это с помощью php -m | grep -i opcache.
# php.ini:
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=0Основные настройки OPcache
Настройте эти параметры для рабочей среды:
# php.ini:
opcache.memory_consumption=256 ; MB of shared memory
opcache.interned_strings_buffer=16 ; MB for interned strings
opcache.max_accelerated_files=20000 ; max scripts to cache
opcache.validate_timestamps=0 ; disable for production!
opcache.revalidate_freq=0 ; how often to check timestampsvalidate_timestamps=0
В рабочей среде установите validate_timestamps=0, чтобы отключить проверку файловой системы при каждом запросе — PHP всегда будет использовать кэшированные опкоды. После развёртывания сбросьте кэш.
Сброс OPcache
Очищайте кэш после развёртывания нового кода.
<?php
opcache_reset(); // from a PHP script
// Or restart PHP-FPM:
$ kill -USR2 $(cat /run/php-fpm.pid)opcache_get_status()
Запрашивайте статистику OPcache во время выполнения, чтобы отслеживать долю попаданий и использование памяти.
<?php
$status = opcache_get_status();
echo "Hit rate: ".$status["opcache_statistics"]["opcache_hit_rate"]."%";Предзагрузка (PHP 7.4+)
Предзагрузка OPcache загружает файлы фреймворка в общую память при запуске сервера, устраняя даже накладные расходы на компиляцию при первом запросе для основных классов.
# php.ini:
opcache.preload=/srv/app/preload.php
opcache.preload_user=www-dataJIT-компиляция (PHP 8.0+)
В PHP 8 появилась JIT-компиляция (Just-In-Time) поверх OPcache, преобразующая опкоды в машинный код. Наибольшая польза заметна для задач, интенсивно использующих CPU; для типичных веб-приложений, ограниченных операциями ввода-вывода, эффект минимален.
# php.ini:
opcache.jit_buffer_size=100M
opcache.jit=1255Неизменяемые классы
OPcache может совместно использовать интернированные строки и неизменяемые определения классов между рабочими процессами, уменьшая потребление памяти каждым процессом.
Итоги
Включите OPcache в рабочей среде с параметром validate_timestamps=0. Очищайте кэш после развёртывания с помощью opcache_reset() или перезапуска PHP-FPM. Отслеживайте долю попаданий с помощью opcache_get_status().
Быстрая проверка
Какой параметр php.ini должен иметь значение 0 в рабочей среде для максимальной производительности OPcache?
Часто задаваемые вопросы
Урок «OPcache: кэширование байткода» бесплатный?
Да — полный текст урока «OPcache: кэширование байткода» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «OPcache: кэширование байткода»?
Включайте и настраивайте OPcache, чтобы устранить издержки повторной компиляции скриптов Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «OPcache: кэширование байткода»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Профилирование PHP с Xdebug
- OPcache: кэширование байткода
- Оптимизация запросов к базе данных
- Управление памятью и советы по производительности