Обновление legacy PHP проекта: пошаговый план
Пять вложенных друг в друга колец разного диаметра на светлой изометрической подложке, на внешнем кольце зелёный сегмент

Обновление legacy PHP проекта: пошаговый план

Обновление legacy PHP-проекта безопасно проходит поэтапно: аудит, тесты, статанализ, Rector, переход по версиям и релиз с возможностью отката.

Обновление legacy PHP-проекта: как перейти на актуальную версию без простоев

Legacy PHP-проект обновляют поэтапно: сначала аудит и тесты, затем статический анализ и автоматический рефакторинг. После этого переходят по версиям PHP по одной за раз и выкатывают релиз с быстрым откатом.

Главное правило: не перепрыгивать через несколько версий и не менять бизнес-логику одновременно с обновлением.

Старый PHP-проект редко выглядит как катастрофа. Он годами приносит деньги, а потом выясняется, что хостинг отказывается поддерживать PHP 5.6, библиотеки не ставятся, а любая правка занимает неделю. Ниже разобрано, как провести обновление предсказуемо: что проверить заранее, в каком порядке менять версии, какие инструменты взять и как не навредить работающему бизнесу.

Почему откладывать обновление опасно

Версии PHP 7.4 и старше больше не получают исправлений безопасности. Любая найденная уязвимость остаётся в вашем проекте навсегда. Для интернет-магазина, личного кабинета или CRM это прямой риск утечки данных и простоя.

Есть и менее заметные последствия. Современные библиотеки и SDK платёжных систем, служб доставки и маркетплейсов всё чаще требуют PHP 8 и выше. Разработчиков, которые хотят работать с кодом на PHP 5.x, становится меньше, а их услуги дорожают. Каждый год промедления увеличивает объём работы: накапливаются удалённые функции, изменённое поведение и несовместимые пакеты.

Чем дольше проект стоит на старой версии, тем дороже обходится переход. Обновление, разбитое на небольшие шаги, всегда дешевле одного аврального «большого взрыва» перед отключением хостинга.

Что даёт обновление legacy PHP-проекта

  1. 01

    Закрытые уязвимости и возвращённая поддержка безопасности от сообщества и хостинг-провайдеров

  2. 02

    Прирост производительности: PHP 7 заметно быстрее PHP 5.6, а PHP 8 добавляет JIT и дальнейшие оптимизации

  3. 03

    Современный синтаксис: типы, enum, match, именованные аргументы, readonly-свойства

  4. 04

    Возможность обновить фреймворк и библиотеки, подключить современные SDK и API

  5. 05

    Более простой найм и онбординг: разработчики охотнее работают с актуальным стеком

  6. 06

    Основа для дальнейшего рефакторинга, автотестов и CI/CD

Этап нулевой: инвентаризация и подготовка

Прежде чем менять версию, нужно понять, с чем вы имеете дело. Выпишите текущую версию PHP, список подключённых расширений, настройки php.ini, cron-задачи и очереди. Проверьте, что версии зависимостей зафиксированы в composer.lock. Если проект подключает библиотеки вручную, копируя папки в репозиторий, это первая вещь, которую стоит привести в порядок.

Второй шаг — воспроизводимое окружение. Поднимите копию проекта в Docker с той же версией PHP, что и на продакшене, и с копией обезличенной базы данных. Если проект запускается локально и на стейджинге, вы можете безопасно экспериментировать. Заодно выясните, какие страницы и разделы реально используются: статистика из Яндекс Метрики или Google Analytics подскажет, какие сценарии критичны, а какой код давно мёртв и его можно не переносить.

Пошаговый план обновления

  1. 01

    Зафиксируйте текущее состояние: версия PHP, расширения, composer.lock, конфигурации, cron-задачи. Разверните идентичную копию проекта в Docker.

  2. 02

    Проведите инвентаризацию зависимостей: команды composer outdated и composer audit покажут устаревшие пакеты и известные уязвимости. Составьте список заброшенных библиотек, которые придётся заменить.

  3. 03

    Создайте тестовую сетку: напишите характеризационные тесты на критичные сценарии — авторизацию, корзину, оплату, формы, импорт и экспорт данных.

  4. 04

    Подключите статический анализ: PHPStan или Psalm и стандарт PHPCompatibility для PHP_CodeSniffer. Получите полный список проблем под целевую версию.

  5. 05

    Автоматизируйте правки: примените Rector с наборами правил для нужной версии PHP и PHP CS Fixer для единого стиля. Проверяйте результат по диффам, а не вслепую.

  6. 06

    Переходите по одной версии за раз: после каждого шага запускайте тесты, смотрите логи на ошибки и Deprecated, прогоняйте стейджинг.

  7. 07

    Выкатывайте постепенно: канареечный релиз или blue-green деплой, мониторинг ошибок и заранее подготовленный план отката.

Тесты как страховочная сетка

Legacy-код опасен тем, что никто не помнит, как он должен работать. Поэтому до обновления нужно зафиксировать текущее поведение. Такие тесты называют характеризационными: они не проверяют, правильно ли работает система, а лишь запоминают, как она работает сейчас. Если после смены версии PHP результат изменился, вы увидите это сразу.

Начните с самого ценного: регистрации и входа, оформления заказа, расчёта цен и скидок, генерации документов, интеграций с платёжными системами. Подойдут PHPUnit, Codeception или обычные HTTP-запросы к тестовому стенду с проверкой ответа. Если юнит-тесты написать трудно из-за запутанного кода, начните с сквозных тестов: они грубее, но защищают от самых дорогих ошибок.

маршрут обновления / 4 шага
  1. 01
    PHP 5.6 → 7.4

    Исчезают функции mysql_* и ereg, устаревают конструкторы по имени класса. Обычно это самый трудоёмкий скачок: нужно переписать работу с БД на PDO или mysqli.

  2. 02
    PHP 7.4 → 8.0

    Удаляются create_function() и each(), меняется сравнение строк и чисел, многие предупреждения превращаются в исключения TypeError и ValueError.

  3. 03
    PHP 8.0 → 8.2

    Передача null во встроенные функции даёт Deprecated, а динамические свойства классов объявляются устаревшими. Лог заполняется предупреждениями — их нужно вычистить.

  4. 04
    PHP 8.2 → 8.3

    Самый спокойный шаг: чаще всего достаточно обновить зависимости и проверить тесты. Можно начинать использовать новые возможности языка.

Что именно ломается при смене версии

Большинство проблем при обновлении повторяются от проекта к проекту. Это удалённые функции, ужесточённые проверки типов и изменённые правила сравнения значений. Хорошая новость в том, что такие вещи хорошо находятся автоматически. Статический анализатор и PHPCompatibility покажут проблемные места ещё до запуска, а Rector исправит часть из них сам.

В таблице ниже собраны самые частые случаи, с которыми сталкиваются при переходе на PHP 7 и 8.

Что изменилосьКак проявляетсяЧто делать
Удалены функции mysql_*Fatal error: вызов неопределённой функции mysql_connect()Перейти на PDO или mysqli и вынести доступ к БД в отдельный слой
Удалены create_function() и each()Fatal error при запуске скрипта на PHP 8Заменить на анонимные функции и foreach, Rector делает это автоматически
Новые правила сравнения строк и чисел, например «abc» == 0Условия срабатывают иначе, чем раньше, и логика молча ломаетсяПрименять строгое сравнение === и явное приведение типов
Передача null во встроенные функцииDeprecated в логах, ошибки при включённом строгом режимеДобавить проверки на null, значения по умолчанию, оператор ??
Динамические свойства классовDeprecated в PHP 8.2, потенциальная ошибка в будущих версияхОбъявить свойства в классе; атрибут AllowDynamicProperties использовать лишь как временную меру

Зависимости и Composer: обновлять с умом

Нередко именно сторонние пакеты тормозят обновление сильнее, чем собственный код. Библиотека, которую не обновляли пять лет, может не поддерживать PHP 8. Начните с команды composer outdated: она покажет, какие пакеты отстали и насколько. Команда composer audit сообщит об известных уязвимостях. Затем для каждой проблемной библиотеки примите решение: обновить, заменить аналогом или вынести нужную часть в собственный код.

Если проект построен на фреймворке (Laravel, Symfony, Yii) или CMS вроде 1С-Битрикс, сначала сверьтесь с таблицей совместимости версий и требованиями ядра и модулей. Иногда обновление PHP придётся делать вместе с обновлением самого фреймворка, и тогда их тоже нужно разбить на шаги. Параметры platform в composer.json помогут проверить, что зависимости подбираются под целевую версию PHP, а не под ту, что сейчас установлена на сервере.

инструменты / что для чего
composer
outdated и audit

Показывают устаревшие пакеты и известные уязвимости в зависимостях.

анализ
PHPStan и Psalm

Находят ошибки типов и обращения к несуществующим методам без запуска кода.

совместимость
PHPCompatibility

Стандарт для PHP_CodeSniffer: перечисляет конструкции, не работающие на целевой версии.

рефакторинг
Rector

Автоматически переписывает устаревший код по наборам правил под нужную версию PHP.

тесты
PHPUnit и Codeception

Фиксируют поведение системы до и после каждого шага обновления.

окружение
Docker

Позволяет параллельно запускать проект на разных версиях PHP и сравнивать результат.

Как не навредить работающему проекту

Самые болезненные провалы при обновлении происходят не из-за сложности кода, а из-за спешки и смешения задач. Команда одновременно меняет версию PHP, переписывает модули и добавляет новые функции. Когда после релиза что-то ломается, невозможно понять, какое именно изменение стало причиной.

Поэтому обновление лучше выделить в отдельный проект с понятными границами. Ниже — ошибки, которые встречаются чаще всего, и способы их избежать.

Типичные ошибки при обновлении legacy PHP

Почти все неудачные миграции сводятся к нескольким повторяющимся ошибкам. Их легко предотвратить, если знать о них заранее.

Как делают неправильно

  • Обновляют PHP на сервере напрямую, без копии окружения и без тестов
  • Перескакивают через несколько мажорных версий за один раз
  • Совмещают обновление с редизайном, новыми функциями и переписыванием модулей
  • Отключают вывод ошибок и Deprecated, чтобы логи «не мешали»
  • Выкатывают релиз для всех пользователей сразу, без плана отката

Как правильно

  1. 01

    Сначала воспроизвести продакшен в Docker и прогнать тесты на целевой версии

  2. 02

    Идти по цепочке версий, фиксируя результат каждого шага отдельным коммитом

  3. 03

    Выделить обновление в отдельную ветку и отдельную задачу, без новых функций

  4. 04

    Включить полный вывод ошибок на стейджинге и последовательно устранить каждое предупреждение

  5. 05

    Использовать канареечный или blue-green релиз и держать готовый откат на предыдущую версию

Релиз, мониторинг и SEO-безопасность

Релиз — это не конец работы, а начало наблюдения. Подключите сбор ошибок (например, Sentry или стандартные логи PHP-FPM) и первые дни после выкатки внимательно следите за новыми исключениями, скоростью ответа и потреблением памяти. Если используете blue-green деплой, держите старую версию окружения включённой, пока не убедитесь, что новая стабильна.

Для сайтов, которые приносят органический трафик, важно проверить и поисковую сторону. Смена версии PHP сама по себе не влияет на позиции, но ошибки 5xx, медленные ответы и сбои в формировании страниц могут навредить индексированию. Следите за отчётами Яндекс Вебмастера и Google Search Console: ошибки сервера, статус индексирования, доступность sitemap и robots.txt. Одновременно сравните поведение посетителей в Яндекс Метрике и Google Analytics до и после релиза. Резкое падение конверсии или рост отказов часто указывает на скрытую ошибку в форме или корзине.

критерии готовности к релизу / ориентиры
0
Deprecated в логах

Стейджинг отработал неделю на целевой версии без новых предупреждений.

100%
Критичных сценариев

Вход, корзина, оплата и формы покрыты тестами и проходят успешно.

0
Ошибок анализатора

PHPStan или Psalm на согласованном уровне не находят новых проблем.

< 1 ч
Время отката

Возврат на прежнюю версию проверен заранее и описан в инструкции.

Не переключайте версию PHP на продакшен-сервере, пока проект не прошёл тесты и стейджинг в контейнере с точно такой же версией и набором расширений. Это самая дешёвая страховка от аварии.

С чего начать прямо сейчас

Обновление legacy PHP-проекта — это серия небольших управляемых шагов, а не одна рискованная операция.
  1. 01

    Зафиксируйте версию PHP, расширения и зависимости, поднимите копию проекта в Docker

  2. 02

    Запустите composer outdated, composer audit и статический анализ, чтобы увидеть реальный объём работ

  3. 03

    Напишите тесты на самые важные бизнес-сценарии

  4. 04

    Двигайтесь по одной версии PHP за раз и релизьте с готовым планом отката

Начните с аудита: он покажет, сколько проблем скрыто в коде и зависимостях, и позволит оценить сроки без догадок. Чем раньше вы разберёте накопившийся технический долг, тем дешевле и спокойнее пройдёт переход на актуальную версию PHP. Если нужна помощь, мы проведём аудит проекта и составим пошаговый план обновления.

Часто задаваемые вопросы

Получите план безопасного обновления вашего PHP-проекта до актуальной версии

Проведём аудит кода и зависимостей и подготовим пошаговую дорожную карту миграции с оценкой сроков.

Бесплатный аудитПлан по этапамОткат без потерь

Обновляем проекты без остановки продаж

Политика конфиденциальности

При оставлении заявки на ресурсе «https://gurucontext.ru» пользователи предоставляют следующие сведения:

  • Имя
  • Контактный телефон или Telegram
  • Адрес сайта пользователя (не обязательно)

Также администрация сайта получает данные об IP-адресе посетителей, типе браузера, времени нахождения на сайте и прочие подобные сведения через сервисы статистики.

Использование информации

Вся полученная информация используется администрацией «https://gurucontext.ru» исключительно в целях связи с клиентом.

Защита персональных данных

Компания «https://gurucontext.ru» обязуется не разглашать сведения, полученные от пользователей, и хранит их в защищённом виде.

Предоставление данных третьим лицам

Полученные сведения не передаются третьим лицам, за исключением случаев исполнения обязательств перед клиентом (с его разрешения) и обоснованных требований закона.

Контакты

Телефон: +7 (499) 955-47-00.
E-mail: info@gurucontext.ru.