Оновлення PHP - це не зміна однієї цифри в Dockerfile. Ламаються зазвичай не нові можливості, а зміни поведінки й залежності.
1. Прочитати посібник з міграції на php.net для кожної версії між поточною й цільовою: несумісні зміни, застаріле, змінені функції.
2. Перевірити залежності:
composer why-not php 8.5
composer outdated --direct
Пакет, що не підтримує нову версію PHP, - найчастіший блокер. Оновити, знайти заміну чи дочекатися релізу.
3. Автоматичні інструменти:
- Rector - автоматично переписує код під нову версію (набори правил
UpgradeToPhp84тощо) і прибирає застарілі конструкції. - PHPStan/Psalm з налаштованою цільовою версією PHP.
- PHPCompatibility для PHP_CodeSniffer - знаходить несумісний код.
4. Тести на обох версіях. Матриця в CI: поточна й нова версія PHP. Поки обидві зелені, можна оновлюватися поступово.
5. Застарілі попередження - як помилки в тестах. Deprecation сьогодні - помилка в наступній мажорній версії. PHPUnit/Pest можна налаштувати так, щоб E_DEPRECATED валили тест.
6. Поступове розгортання: спершу стейджинг, потім частина продакшн-трафіку (канарка), моніторинг помилок і швидкодії, і лише потім усе.
Типові проблеми при оновленні:
- PHP 8.0: порівняння чисел з рядками,
TypeErrorзамість попереджень у вбудованих функціях. - PHP 8.1: передача
nullу параметри вбудованих функцій, що не приймають null (deprecated). - PHP 8.2: динамічні властивості й інтерполяція
${var}- deprecated. - PHP 8.4: неявно nullable параметри - deprecated.
Не відкладати надовго: кожна версія PHP отримує виправлення безпеки обмежений час. Оновлюватися щороку на одну версію значно легше, ніж стрибати через три.