OPcache и выкладка PHP: почему после релиза виден старый код

2 мин чтения

Что проверить в OPcache, если файлы PHP обновлены, а веб-приложение продолжает выполнять прежний код.

От релиза к исполняемому коду
  1. Новый кодВыкладываем согласованный набор файлов
  2. Рабочий процесс PHPПроверяем OPcache именно в обслуживающем SAPI
  3. Обновлённый кэшПрименяем процедуру релиза и проверяем ответ

Релиз выложен, файлы на месте, а в браузере всё ещё старое поведение. Прежде чем выкладывать заново, проверьте 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 публичными. После проверки удалите временную страницу либо закройте её действующей авторизацией.

Источники и дальнейшее чтение