Перейти к содержимому

Переход на новую версию PHP - порядок, проверки, откат

Переводим сайт на новую версию PHP так, чтобы он открылся после переключения, а не встретил посетителей белым экраном.

Решение

Смотрим, откуда и куда переезжаем:

Окно терминала
php -v
php -m | grep -iE 'mysqli|mbstring|gd|zip|opcache' # набор расширений
grep -r "define('SM_VERSION'" /home/bitrix/www/bitrix/modules/main/ | head -1
# версия главного модуля решает, с какими версиями PHP ядро вообще работает

Порядок здесь жёсткий: сначала ядро, потом код проекта, и только затем сама версия. Переключение версии на старом ядре даёт белый экран сразу после перезапуска, и откатывать приходится вслепую.

Ищем устаревшие конструкции в своём коде:

Окно терминала
grep -rn "each(\|create_function\|ereg(" /home/bitrix/www/local/ | head -20
grep -rn "{\$" /home/bitrix/www/local/php_interface/ | head -10
# свои модули и обработчики - главный источник отказов после переключения

Ядро платформы к новой версии готовят её разработчики, а код проекта - никто. Обработчики событий, свои модули и правки в шаблонах и есть то, что ломается после переезда чаще всего.

Обновляем продукт до переключения:

// административная часть: Marketplace - Обновление платформы
echo SM_VERSION, "\n";
// проверка доступности каталога обновлений перед запуском
if (!CUpdateClientPartner::CheckUpdatability($errorMessage)) {
echo $errorMessage, "\n";
}
// обновление ядра снимает половину несовместимостей заранее

Обновление ядра снимает большую часть несовместимостей заранее. Свежая версия знает о новой версии языка, а трёхлетняя - нет, и никакие настройки этого не меняют.

Переключаем версию и проверяем:

Окно терминала
/opt/webdir/bin/bx-php -a change_version --version=8.1
systemctl restart bx-php-fpm nginx
tail -f /var/log/php-fpm/bx0-error.log # ошибки первых минут - самые важные
# ветку переключают средствами окружения: правка конфигов руками не переживёт обновление

Версию переключают средствами окружения: оно поставит нужные расширения и перенастроит пулы. Ручная установка пакетов оставляет сайт с половиной расширений, а запуск задач по расписанию - на прежней версии.

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

Версию стоит поднимать не через ступеньку, а последовательно. Переезд сразу на две версии вперёд складывает несовместимости в одну кучу, и понять, какая именно правка сломала обмен, становится заметно труднее.

Откат должен быть готов заранее. Копия перед переездом и знание команды возврата превращают неудачный переход в десять минут простоя вместо ночи разбирательств.

Типичные проблемы

После переключения сайт отдаёт белый экран.

Ядро не обновлено под новую версию языка. Обновление продукта делают до переключения версии, а не после.

Сайт работает, а свой модуль падает.

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

Пропали расширения, которые были раньше.

Версия переключена вручную, минуя окружение. Оно ставит набор расширений под каждую версию само.

Задачи по расписанию работают по-старому.

Запуск по расписанию продолжает вызывать прежнюю версию. Путь к исполняемому файлу в задании правят отдельно.

Ошибки видны только под нагрузкой.

Настройки пула не перенесены на новую версию. Их сверяют с прежними значениями сразу после переключения.

Частые вопросы

Можно ли обновить PHP без обновления продукта?

Технически да, практически нет: старое ядро о новой версии не знает. Порядок «сначала продукт» экономит вечер разбирательств.

Как проверить совместимость заранее?

Развернуть копию сайта на площадке с новой версией и пройти основные сценарии. Проверка на копии стоит часа, откат на боевом - гораздо дороже.

Что делать со старыми решениями из каталога?

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

Заметно ли ускорение после перехода?

Да, новые версии считают заметно быстрее на том же коде. Выигрыш виден на страницах с тяжёлой логикой, а не на отдаче статики.

Смежное

Первоисточник