Определение простыми словами
Когда PHP получает запрос, он читает .php-файлы, парсит код и компилирует во внутренние инструкции (opcode), и только потом выполняет. OpCache сохраняет результат компиляции в общей памяти процесса PHP. Следующий запрос пропускает чтение и парсинг — берёт готовый opcode и сразу выполняет. Это снижает CPU и TTFB в 2–4 раза.
OpCache входит в стандартную поставку PHP с версии 5.5 и включён по умолчанию в большинстве дистрибутивов. Тонкая настройка касается размера памяти, максимального числа файлов и режима валидации.
Сравнение
| Кеш | Что хранит | Уровень | Совместимость |
|---|---|---|---|
| OpCache | PHP-байткод (opcode) | Интерпретатор | PHP 5.5+ |
| APCu | Произвольные данные | Приложение | PHP 7+ |
| Object cache | Объекты приложения | Приложение | WP, Drupal, Magento |
| Page cache | Готовый HTML | Web-сервер | Nginx, Varnish |
Кейсы использования
- WordPress на VPS: включение OpCache снижает TTFB админки с 800 мс до 200 мс без изменения кода.
- Laravel в проде:
php artisan config:cache+ OpCache + preload-файл дают двукратный прирост RPS. - 1C-Битрикс: OpCache + APCu закрывают рекомендации производительности из «Проверки системы».
- Негативный кейс: на проде включают
opcache.validate_timestamps=1с интервалом 0 — кеш сбрасывается каждый раз, эффект пропадает. - Негативный кейс: размер
opcache.memory_consumptionмал, и часть файлов не помещается. Появляются «out of memory» в логе и сервер теряет производительность скачками.
Технические детали
# Проверить, включён ли OpCache
php -i | grep -i opcache.enable
# Посмотреть статистику
php -r 'print_r(opcache_get_status(false));'
# Конфиг для прода: /etc/php/8.2/fpm/conf.d/10-opcache.ini
# opcache.enable=1
# opcache.memory_consumption=256
# opcache.max_accelerated_files=20000
# opcache.validate_timestamps=0
# opcache.revalidate_freq=0
# opcache.preload=/var/www/preload.php
# Сброс OpCache без рестарта PHP-FPM
cachetool opcache:reset --fcgi=/run/php/php-fpm.sock
🔥 Где это применяется
Частые вопросы
Сколько памяти выделять OpCache?
Для типового WordPress — 128–256 МБ. Для Битрикс — 256–512 МБ. Для крупного Laravel-приложения с тысячами файлов и preload — от 512 МБ. Контролируйте usage через opcache_get_status и доводите до 70–80% занятости.
Чем OpCache отличается от APCu?
OpCache хранит скомпилированный PHP-байткод и работает прозрачно для приложения. APCu — это user-space кеш для произвольных данных приложения: настройки, результаты запросов, объекты. Часто используются вместе.
Нужно ли отключать OpCache на dev-машине?
Не отключать, а включить валидацию изменений: opcache.validate_timestamps=1 и opcache.revalidate_freq=0. Так разработчик видит изменения мгновенно, но кеш всё равно работает.