Переход на новую версию PHP - порядок, проверки, откат
Переводим сайт на новую версию PHP так, чтобы он открылся после переключения, а не встретил посетителей белым экраном.
Решение
Смотрим, откуда и куда переезжаем:
php -vphp -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 -20grep -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.1systemctl restart bx-php-fpm nginxtail -f /var/log/php-fpm/bx0-error.log # ошибки первых минут - самые важные# ветку переключают средствами окружения: правка конфигов руками не переживёт обновлениеВерсию переключают средствами окружения: оно поставит нужные расширения и перенастроит пулы. Ручная установка пакетов оставляет сайт с половиной расширений, а запуск задач по расписанию - на прежней версии.
Проверяют не главную страницу, а сценарии: оформление заказа, обмен с учётной системой, отправку письма и вход в административную часть. Белый экран заметен сразу, а сломанный обработчик события - только на живом заказе.
Версию стоит поднимать не через ступеньку, а последовательно. Переезд сразу на две версии вперёд складывает несовместимости в одну кучу, и понять, какая именно правка сломала обмен, становится заметно труднее.
Откат должен быть готов заранее. Копия перед переездом и знание команды возврата превращают неудачный переход в десять минут простоя вместо ночи разбирательств.
Типичные проблемы
После переключения сайт отдаёт белый экран.
Ядро не обновлено под новую версию языка. Обновление продукта делают до переключения версии, а не после.
Сайт работает, а свой модуль падает.
В коде проекта остались конструкции, убранные из языка. Их ищут поиском по каталогу своих решений.
Пропали расширения, которые были раньше.
Версия переключена вручную, минуя окружение. Оно ставит набор расширений под каждую версию само.
Задачи по расписанию работают по-старому.
Запуск по расписанию продолжает вызывать прежнюю версию. Путь к исполняемому файлу в задании правят отдельно.
Ошибки видны только под нагрузкой.
Настройки пула не перенесены на новую версию. Их сверяют с прежними значениями сразу после переключения.
Частые вопросы
Можно ли обновить PHP без обновления продукта?
Технически да, практически нет: старое ядро о новой версии не знает. Порядок «сначала продукт» экономит вечер разбирательств.
Как проверить совместимость заранее?
Развернуть копию сайта на площадке с новой версией и пройти основные сценарии. Проверка на копии стоит часа, откат на боевом - гораздо дороже.
Что делать со старыми решениями из каталога?
Обновить их или заменить: авторы часто выпускают версии под новый язык. Решение без обновлений - главный аргумент против переезда.
Заметно ли ускорение после перехода?
Да, новые версии считают заметно быстрее на том же коде. Выигрыш виден на страницах с тяжёлой логикой, а не на отдаче статики.
Смежное
- Обновления платформы и PHP - оглавление подтемы
- Ошибка после обновления PHP: причины по убыванию частоты - разбор, когда сайт уже сломался
- Обновление продукта: подготовка, порядок, откат - первый шаг переезда
- Обновление окружения и версии PHP - средства самого окружения
- Инфраструктура и хостинг - устройство площадки целиком