OPcache и выкладка PHP: почему после релиза виден старый код
Что проверить в OPcache, если файлы PHP обновлены, а веб-приложение продолжает выполнять прежний код.
- Новый кодВыкладываем согласованный набор файлов
- Рабочий процесс PHPПроверяем OPcache именно в обслуживающем SAPI
- Обновлённый кэшПрименяем процедуру релиза и проверяем ответ
Релиз выложен, файлы на месте, а в браузере всё ещё старое поведение. Прежде чем выкладывать заново, проверьте OPcache у того процесса, который обслуживает сайт. Настройки PHP в терминале и PHP-FPM могут отличаться. Разберём, как проверка изменений файлов связана с процедурой обновления приложения.
Смотрим настройки именно веб-процесса
$status = function_exists('opcache_get_status')
? opcache_get_status(false)
: false;
// Просматривайте результат только через защищённую диагностику.
// Не отдавайте этот массив публичным endpoint-ом.Параметры командного PHP и PHP-FPM могут отличаться. Поэтому проверка из CLI не обязательно описывает состояние веб-приложения. Сначала установите, какой php.ini и какой пул FPM используются для конкретного сайта.
Два важных параметра
opcache.validate_timestamps определяет, будет ли OPcache учитывать изменения файлов. При включённой проверке на периодичность влияет opcache.revalidate_freq. Если проверка отключена, обновление файлов само по себе не гарантирует смену закэшированного кода: процедуре релиза нужен явный способ обновить обслуживающие процессы или их кэш.
Не копируйте набор «ускоряющих» параметров без сценария обновления. Настройки памяти, предельное число файлов и доля попаданий в кэш оцениваются на вашем приложении. Изменение одного параметра не исправит ситуацию, когда запросы вообще попадают на другой экземпляр сервиса.
Проверка релиза
Добавьте приложению безопасный идентификатор сборки, который виден в защищённой диагностике. После выкладки проверьте его на каждом обслуживающем экземпляре. Сверьте журнал ошибок, несколько ключевых операций и состояние OPcache. Это полезнее, чем судить о релизе по изменению времени файла.
Путь к файлам и конфигурация PHP могут раскрывать внутреннее устройство сервера. Не оставляйте phpinfo или панель OPcache публичными. После проверки удалите временную страницу либо закройте её действующей авторизацией.
