php-fpm отдаёт старый код после выкладки
PHP кеширует скомпилированный код, и по умолчанию проверяет изменения файлов не на каждом запросе. После выкладки новая версия может не примениться, пока кеш не сброшен или не истечёт срок проверки.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Проверка изменений файлов отключена
На боевых серверах проверку часто отключают ради скорости. Тогда кеш живёт до перезагрузки службы.
-
Срок проверки изменений велик
При заданном интервале проверки файл перечитывается не сразу. Разница между выкладкой и применением достигает минут.
-
Выкладка меняет файлы на месте
Замена файлов по одному приводит к смеси версий: часть уже новая, часть ещё в кеше. Это опаснее задержки.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Действующие настройки кеша скомпилированного кода.
php -i | grep -E "^opcache"Перезагрузка обработчика сбрасывает кеш.
sudo systemctl reload php8.3-fpm && echo сброшеноРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- На боевых серверах проверку часто отключают ради скорости. Тогда кеш живёт до перезагрузки службы.
- Как проверить
-
Посмотрите настройки кеша.
php -i 2>/dev/null | grep -E "opcache.validate_timestamps|opcache.revalidate_freq|opcache.enable"
- Как исправить
-
Добавьте в выкладку перезагрузку обработчика:
systemctl reload php8.3-fpmсбрасывает кеш без разрыва запросов.
- Почему происходит
- При заданном интервале проверки файл перечитывается не сразу. Разница между выкладкой и применением достигает минут.
- Как проверить
-
Посмотрите значение интервала.
php -i 2>/dev/null | grep opcache.revalidate_freq
- Как исправить
- Либо сократите интервал, либо явно перезагружайте обработчик при выкладке. Второе предсказуемее.
- Почему происходит
- Замена файлов по одному приводит к смеси версий: часть уже новая, часть ещё в кеше. Это опаснее задержки.
- Как проверить
-
Посмотрите, как устроена выкладка.
ls -l /var/www/ | head
- Как исправить
- Выкладывайте новую версию в отдельный каталог и переключайте ссылку: тогда переход мгновенный, а кеш сбрасывается перезагрузкой обработчика.
Пример вывода
Файлы обновлены, сайт отдаёт прежнюю версию. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ php -i | grep validate_timestamps
opcache.validate_timestamps => Off => Off
$ ls -l --time-style=full-iso /var/www/app/index.php
-rw-r--r-- 1 www-data www-data 4210 2026-09-15 16:40:02 /var/www/app/index.php
# при этом сайт отдаёт код от 15:10
Связанные ошибки
- nginx reload не применяет изменения Перезагрузка nginx прошла, а изменения не действуют: правка не в том файле, файл не включён, кеш, старые рабочие процессы.
- Warning: The unit file … changed on disk Предупреждение о том, что unit-файл изменился на диске: systemd работает со старой версией. Когда нужен daemon-reload.
- Text file busy при обновлении программы Ошибка 26 при записи в исполняемый файл: он выполняется прямо сейчас. Как правильно обновлять программы служб.
- php-fpm: Allowed memory size exhausted Скрипт исчерпал предел памяти PHP: ошибка 500, оборванные запросы. Где менять предел и когда он спасает.
- php-fpm: server reached pm.max_children setting Пул php-fpm исчерпал рабочие процессы: сайт отвечает медленно или отдаёт 502. Как считать pm.max_children.
- php-fpm: ошибка в описании пула и отказ запуска php-fpm не запускается: неверный параметр в pool.d, несуществующий пользователь, недоступный путь сокета.
- Приложение не перечитывает настройки по сигналу Перезагрузка настроек не применяет изменения: приложение не поддерживает сигнал или читает файл только при старте.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
Где встречается чаще всего
Источники
- Документация PHP: настройка OPcache
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено выкладкой при отключённой проверке изменений: помогает только перезагрузка обработчика.