Тимур ТурдыевНаписать

кейс · 2022

Кабинет и телеметрия IoT-платформы: с Zend Framework 2 на Laminas и PHP 8

Перевёл кабинет клиентов и бэкенд телеметрии Waviot с Zend Framework 2.3 и PHP 5.6 на Laminas и PHP 8 без остановки платформы, а потом закрепил результат: PSR-12, миграции БД, Sentry.

PHP 8LaminasZend Framework 2MongoDBDoctrineSentry

Что было ​

Waviot - IoT-платформа на протоколе NB-Fi: приборы учёта воды, электричества и тепла шлют показания через свои модемы и базовые станции. Кабинет клиентов lk.waviot.ru и центральный бэкенд телеметрии b.waviot.ru писались с 2014 года на Zend Framework 2 и PHP 5.6. К 2022 году это был тупик: ZF2 давно без поддержки, PHP 5.6 тоже, doctrine/mongodb-odm в бете 2015 года, Excel-выгрузки на PHPExcel, пользователи на заброшенном zfc-user.

Обе системы работают круглосуточно: клиенты смотрят показания, интеграторы ходят в API, приборы шлют данные. Остановить их на время переезда было нельзя.

Как переезжали ​

Переход я сделал в отдельной ветке laminas, сначала в кабинете (апрель 2022), потом в телеметрии (май 2022). Пересобрал проект на laminas/skeleton-application: около 50 пакетов laminas/* вместо zendframework 2.3, PHP ^8.0 || ^8.1 вместо >=5.6.1, lm-commons/lmc-user вместо zfc-user, doctrine/mongodb-odm 2.x, PhpSpreadsheet вместо PHPExcel, новый драйвер MongoDB вместо старого MongoDate.

Дальше шла работа, которую не видно в composer.json: сервисы и фабрики под новый ServiceManager, JWT и настройки окружения, переводчик и шаблоны, кеш, протоколы приборов. В ветке кабинета 83 коммита, 64 из них мои, остальное в основном слияния с master от коллеги. В июне 2022 кабинет ушёл в master, в июле - телеметрия.

Что было после переезда ​

Самое неприятное в таком переходе случается не в день релиза, а в следующие недели: PHP 8 строже к типам, и ошибки вылезают в редких сценариях. Поэтому первым делом я подключил Sentry и дальше закрывал ошибки по его отчётам: Cannot use Laminas\Filter\Null as Null, TypeError в чекбоксах форм, чтение старых документов из MongoDB.

Когда всё успокоилось, закрепил результат, чтобы код снова не расползся:

  • PSR-12 по всему кабинету и телеметрии, проверка phpcs в pre-commit хуке;
  • Doctrine Migrations для MySQL: начальная схема и справочники каналов, протоколов, OBIS-кодов и типов приборов теперь в миграциях, а не в ручных SQL;
  • свой форк laminas-console: официальный пакет забросили, а консольные команды кабинета на нём держатся;
  • требование PHP поднял до ^8.1.

Итог ​

Кабинет и телеметрия живут на поддерживаемом стеке и с 2022 года обновляются обычным порядком. Сервер лицензий на Yii2 я после этого обновил так же: с PHP 5.6 и Yii 2.0.11 до PHP 8 и Yii 2.0.45.

Главный вывод: переход фреймворка - это не замена неймспейсов, а несколько месяцев работы, которая начинается после релиза. Без Sentry с первого дня я бы узнавал об ошибках от клиентов.

© 2014-2026 Тимур ТурдыевСайт и справочник работают на VPS от AdminVPS