Ответ
При миграции проектов с PHP 7.4 на 8.x я сталкивался со следующими основными проблемами:
-
Критические изменения в ядре языка. Наиболее болезненным было изменение поведения некоторых функций, например, строгий режим для арифметических и побитовых операций с типами, отличными от
int/float. Это приводило кTypeErrorв местах, где раньше работало неявное приведение.// В PHP 7.4: Работало, результат '50' // В PHP 8.0: Выбрасывается TypeError $result = '5' * '10'; -
Удаление устаревших (deprecated) функций и конструкций. Например, при переходе на PHP 8.0 нужно было заменить
create_function()на анонимные функции, а в PHP 8.1 — убрать все вызовы устаревшихmysqliиPDOсигнатур. -
Несовместимость сторонних расширений и библиотек. Некоторые PECL-расширения (например,
mongodbв определенных версиях) или даже композер-пакеты, не обновленные для PHP 8, переставали работать. -
Изменения в стандартной библиотеке (SPL). Некоторые классы, такие как
ArrayObject, стали более строгими в отношении типов при сериализации.
Мой подход к обновлению:
- Первым делом запускаю статический анализ через
PHPCompatibility(в связке сphpcs) для всего кодовой базы. - Поднимаю отдельное тестовое окружение (staging) с новой версией PHP и запускаю полный набор юнит- и интеграционных тестов.
- Включаю режим
error_reporting(E_ALL);и внимательно изучаю лог-файлы на предмет предупреждений и уведомлений, которые в новой версии могли стать ошибками. - Для legacy-проектов без покрытия тестами использую стратегию «двойного запуска»: постепенно перевожу на новую версию наименее загруженные части приложения, тщательно мониторя логи и метрики.
Ответ 18+ 🔞
А, ну это классика, ебать мои старые костыли! Каждый раз, когда вылезаешь из тёплого болота старой пыхи на свежий воздух восьмой версии, начинается цирк с конями.
Слушай, основные грабли, на которые наступают все, как один:
-
Ядро языка решило поумнеть. Раньше можно было строки друг на друга умножать, и тебе бы тихонечко число подсунули. Теперь нет, ёпта! Теперь будет
TypeErrorи требование, чтобы ты в своем уме был. Как будто на дворе 2002-й год, и все вдруг стали педантичными бухгалтерами.// Раньше: '5' * '10' = 50. Магия, хуле. // Теперь: Ты чё, мудила, строки перемножаешь? Иди нахуй с такими запросами. $result = '5' * '10'; // БАБАХ! TypeError. -
Выкинули весь старый хлам. Функции, которые лет десять как гробили, наконец-то прибили.
create_function()— отдыхает. Теперь только анонимные, красавчик. И всякие старые сигнатуры уmysqli— тоже в утиль. Библиотекари пришли и вынесли весь хлам с чердака. -
Расширения отваливаются. Это вообще отдельная песня. Какая-нибудь библиотека или PECL-расширение, которое последний раз обновляли при царе Горохе, просто накрывается медным тазом. Заходишь на сайт — а там поддержка только до 7.4. И сидишь, такой, с круглыми глазами: «И чё теперь делать?». Волнение ебать.
-
Стандартные классы застегнулись на все пуговицы. Тот же
ArrayObjectстал такой принципиальный, когда дело доходит до типов и сериализации. Раньше проглотил бы что угодно, а теперь — «нет, я так не играю, соблюдайте протокол».
А вот как я это делаю, чтобы не сойти с ума:
- Первым делом — статический анализатор. Беру
PHPCompatibility, натравиваю на всю кодобазу и смотрю, где он матерится. Он, блядь, как рентген, все кости показывает. Все несовместимости — на блюдечке. - Дальше — тестовый полигон. Поднимаю staging, ставлю новую пыху и запускаю ВСЕ тесты. Если тестов нет — это уже пиздец, а не миграция. Тогда сразу иди пить.
- Включаю параноидальный режим логирования.
error_reporting(E_ALL);— и вжух! Все предупреждения, которые раньше были тихим шёпотом, теперь орут как резаные. Сидишь и читаешь логи, как детектив. - Для легаси-проектов (где тестов — ноль) — тактика партизана. Беру самый незначительный, не нагруженный кусок приложения, перевожу его на новую версию и смотрю, не развалилось ли всё. Мониторю логи, метрики, молюсь богам. Если выжил — иду дальше. Медленно, печально, но иду.
Короче, процесс это долгий и нудный. Но если делать по уму, а не втыкать новую версию в прод в пятницу вечером, то можно и не поседеть. Хотя, блядь, поседеешь всё равно, просто меньше.