#Что происходит и когда применима инструкция
После замены PHP-файлов сайт может продолжать выполнять предыдущую версию кода, если OPcache не проверяет время изменения файлов. Сначала нужно отличить кэш PHP от кэша CDN, приложения и браузера; перезапуск всех служб без диагностики способен прервать запросы и не исправить причину.
#Причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Отключена проверка меток времениОтключена проверка меток времени. В FPM opcache.validate_timestamps=0 и после выкладки PHP-файла изменения не подхватываются. | В FPM opcache.validate_timestamps=0 и после выкладки PHP-файла изменения не подхватываются. | Согласовать управляемый сброс OPcache при развёртывании. |
| Проверка происходит не сразуПроверка происходит не сразу. opcache.validate_timestamps=1, но ещё не истёк opcache.revalidate_freq. | opcache.validate_timestamps=1, но ещё не истёк opcache.revalidate_freq. | Подождать заданный интервал или использовать штатную процедуру релиза. |
| Устаревший ответ отдаёт не PHPУстаревший ответ отдаёт не PHP. Статическая страница или CDN показывает старое даже после сброса PHP. | Статическая страница или CDN показывает старое даже после сброса PHP. | Проверить заголовки ответа и кэш приложения/прокси. |
#Подробная пошаговая инструкция
- Сделайте контрольное изменение в тестовом маршрутеВ специально выделенном тестовом PHP-файле измените безвредную текстовую метку версии. Не вносите случайные правки в действующие сценарии оплаты, авторизации или конфигурации. Зафиксируйте размер и время изменения файла и сделайте запрос из приватного окна с отключённым кэшем браузера.
- Проверьте фактические параметры через веб-окружениеЗначения PHP CLI могут отличаться от FPM. В доступном только администратору диагностическом маршруте временно выведите ini_get для opcache.validate_timestamps и opcache.revalidate_freq; убедитесь в названии пула и версии. Не публикуйте phpinfo в открытом доступе и удалите диагностику после проверки.
- SSH, только чтение конфигурации CLI: ориентир, а не доказательство настроек FPMLinux · Терминал (Bash)КомандаSSH, только чтение конфигурации CLI: ориентир, а не доказательство настроек FPM. Сверьте с веб-значениями.
php -i | grep -Ei "opcache.validate_timestamps|opcache.revalidate_freq|opcache.enable"
- Различите OPcache и внешнее кэшированиеПроверьте HTTP-заголовки и наличие признаков HIT от CDN/прокси. Если HTML устарел, а метка в некэшируемом тестовом PHP уже новая, вероятнее кэш ответа. Если тестовый PHP возвращает старую метку без посредников, изучайте OPcache и маршрут к нужному каталогу релиза.
- В локальном терминале с curl, подставьте собственный адресLinux · Терминал (Bash)КомандаВ локальном терминале с curl, подставьте собственный адрес. -I делает HEAD; некоторые приложения обрабатывают HEAD иначе, при сомнениях проверьте GET. Не вставляйте приватные токены.
curl -sSI https://example.com/test-version.php
- Выберите управляемое обновление кэшаЕсли validate_timestamps=0 включён намеренно для производительности, используйте предусмотренный процессом выпуска сброс OPcache из того же FPM-пула или безопасную перезагрузку только нужной службы. opcache_reset, вызванный в CLI, обычно не сбрасывает общую память OPcache веб-процессов. Не создавайте общедоступный файл reset.php.
- Если включена проверка времени, изучите задержку и файловую выкладкуПри validate_timestamps=1 настройка revalidate_freq задаёт период проверки; сравните с моментом релиза. Если каталог переключается символической ссылкой, проверьте realpath_cache, сам факт переключения целевого пути и маршрутизацию document root. Не стирайте OPCache файловую память вручную без понимания своей схемы запуска.
- Дополнительная команда по темеLinux · Терминал (Bash)С осторожностьюНужен sudoSSH с административными правами, пример Debian PHP 8.2: тест и согласованная перезагрузка экземпляра. На рабочем сайте операция может повлиять на активные запросы.
sudo php-fpm8.2 -t && sudo systemctl reload php8.2-fpmКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Сравните результат до и послеПосле штатного сброса или истечения интервала повторно запросите тестовый маршрут. Новая метка должна появиться и сохраняться в новых запросах. Удалите временный файл и верните конфигурацию к принятой политике выкладки.
#Как проверить, что проблема исправлена
Контрольный PHP-файл отображает новую версию при запросе через тот же сайт и пул, старые HTML-ответы больше не возникают после очистки соответствующего уровня кэша.
#Если не помогло — дальнейшая диагностика и откат
Если содержание не поменялось, проверьте, что редактируется тот document root, куда действительно смотрит сайт, что нет второго сервера, контейнера или узла и что процесс выкладки не откатил файлы.