Что такое opcache и как его настроить?php-49

OPcache — это встроенный в PHP байт-код кэш, который значительно увеличивает производительность PHP-приложений за счет кэширования скомпилированных скриптов.

1. Как работает OPcache

  1. Компиляция: PHP-скрипт преобразуется в байт-код (opcodes)
  2. Кэширование: Байт-код сохраняется в общей памяти
  3. Исполнение: При повторных вызовах используется кэшированная версия

2. Основные настройки в php.ini

2.1. Базовые параметры:

opcache.enable=1          ; Включить OPcache
opcache.memory_consumption=128  ; Память под кэш (MB)
opcache.interned_strings_buffer=8 ; Буфер для интернированных строк
opcache.max_accelerated_files=4000 ; Макс. число кэшируемых файлов

2.2. Критически важные настройки для production:

opcache.validate_timestamps=0 ; Не проверять изменения файлов
opcache.revalidate_freq=0     ; Частота проверки (сек)
opcache.save_comments=0       ; Не сохранять комментарии
opcache.enable_cli=0         ; Отключить для CLI

2.3. Оптимальные настройки для высоконагруженных проектов:

opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.fast_shutdown=1
opcache.huge_code_pages=1    ; Использовать huge pages (Linux)

3. Проверка статуса OPcache

3.1. Через phpinfo:

<?php phpinfo(); ?>

3.2. Использование opcache_get_status:

print_r(opcache_get_status());

Пример вывода:

[
    "opcache_enabled" => true,
    "memory_usage" => [
        "used_memory" => 62358624,
        "free_memory" => 7759824,
        "wasted_memory" => 234232,
    ],
    "opcache_statistics" => [
        "num_cached_scripts" => 432,
        "hits" => 123456,
        "misses" => 12,
        "blacklist_misses" => 0,
    ]
]

4. Сброс кэша

4.1. Программный сброс:

opcache_reset(); // Сбросить весь кэш

4.2. По файлу:

opcache_invalidate('/path/to/script.php', true);

5. Решение проблем

5.1. Нехватка памяти:

  • Увеличить opcache.memory_consumption
  • Уменьшить opcache.max_accelerated_files
  • Проверить opcache_get_status()['memory_usage']['wasted_memory']

5.2. Устаревший кэш:

  • В development: opcache.validate_timestamps=1
  • В production: сбрасывать кэш при деплое

6. Интеграция с фреймворками

6.1. Laravel:

Добавить в config/opcache.php:

return [
    'enabled' => env('OPCACHE_ENABLED', true),
];

6.2. Symfony:

Использовать скрипт для сброса кэша при деплое:

php bin/console cache:clear --env=prod

7. Мониторинг и анализ

7.1. Полезные метрики:

  • Hit rate: hits/(hits+misses) > 90%
  • Used memory: < выделенной памяти
  • Wasted memory: минимальное значение

7.2. Инструменты мониторинга:

  • Prometheus + Grafana
  • New Relic
  • Datadog

Резюмируем:

OPcache — важнейший инструмент для ускорения PHP-приложений. Правильная настройка позволяет достичь 50-70% прироста производительности. Ключевые параметры: достаточный объем памяти, отключение проверки файлов в production и мониторинг hit rate. Всегда сбрасывайте кэш при деплое новых версий кода.