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