PHP: изменения в коде не применяются из-за OPcache

  • Обновлено
  • Чтение ≈ 2 минуты

Краткий ответ

OPcache кэширует скомпилированный код. После деплоя сбросьте кэш или настройте validate_timestamps и revalidate_freq.

В этой статье
  1. Что означает ошибка
  2. Причины и признаки
  3. Пошаговое решение
  4. Проверка результата

#Что означает ошибка

Сообщение
Изменения не видны

OPcache кэширует скомпилированный код. После деплоя сбросьте кэш или настройте validate_timestamps и revalidate_freq.

#Причины и признаки

Возможная причинаКак узнатьЧто делать
Включён OPcachePHP обслуживает старую версию кодаСверить активный файл и кэш
validate_timestamps=0validate_timestamps выключенСбросить OPcache при публикации
Кэш браузераHTTP обновляется только после очистки браузераПроверить браузер и CDN
Несколько FPMНа разных узлах разные версии кодаОбновить каждый PHP-FPM-пул/узел

#Пошаговое решение

  1. Установите, действительно ли виноват OPcacheОткройте конкретную страницу и проверьте, что редактируемый файл находится в активном DOCUMENT_ROOT, а запрос обслуживает ожидаемый пул PHP-FPM. Через временную закрытую диагностическую страницу прочитайте php_ini_loaded_file(), opcache_get_status(false) и opcache_get_configuration(); для CLI результаты могут отличаться. Если файл на сервер вообще не загрузился, сброс кэша ничего не исправит — сначала проверьте развертывание.
  2. Проверьте параметры проверки измененийВ настройках активного веб-PHP найдите opcache.enable, opcache.validate_timestamps, opcache.revalidate_freq. При validate_timestamps=0 PHP не будет самостоятельно проверять изменения файлов после развертывания; это допустимо только при процедуре сброса. При validate_timestamps=1 OPcache проверяет файлы с заданной периодичностью. Не правьте все php.ini подряд: на сервере могут одновременно работать несколько версий и пулов PHP.
  3. Сбросьте кэш только нужного веб-процессаСогласуйте окно обслуживания: перезапуск нужного PHP-FPM-пула обычно очищает его OPcache, но прервёт активные запросы этого пула. Вызов opcache_reset() из CLI по умолчанию не сбрасывает OPcache веб-FPM; если используете временный веб-обработчик для сброса, защитите его от постороннего доступа и сразу удалите. Если применяется несколько узлов за балансировщиком, нужно обновить каждый, а не только один.
  4. Проверьте свежую версию страницы и журналОбновите страницу без браузерного кэша, проверьте выполняемый участок кода и отсутствие старого поведения; отдельно учтите кэш приложения, шаблонов, CDN и браузера. Если новый код виден на одном узле, но не на другом, сопоставьте пул PHP, путь релиза и данные OPcache на каждом узле. Верните временно изменённые параметры к эксплуатационным значениям и удалите страницу диагностики.

#Проверка результата

Для «PHP: изменения в коде не применяются из-за OPcache» выполните штатную проверку конфигурации, затем один контрольный запрос к сервису. Сверьте его результат с журналом и убедитесь, что пользователи не получили новых ответов 4xx или 5xx после изменения.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.