Перевод проекта на Битриксе на PHP8. Инструкция к применению

Всем привет, это команда DIGIMATIX. Компания Битрикс прекратила поддержку и обновление продуктов на PHP версии ниже 8.0. Что произошло и чем это грозит для владельцев ресурсов – ответим в этой статье.

Перевод проекта на Битриксе на PHP8. Инструкция к применению

Кому и зачем?

Все проекты, созданные с использованием продуктов 1С-БИТРИКС и БИТРИКС24 коробочная версия, нуждаются в обновлении на PHP 8.0 и выше.

Вот несколько причин, почему это необходимо:

  • Новые версии PHP предоставляют важные обновления и исправления ошибок, которые не доступны на старых версиях.
  • Наличие уязвимостей, которые представляют угрозу безопасности для проектов в старых версиях.
  • Повышение производительности на версии 8.1 (в некоторых тестах до 30%), что особенно важно для проектов с высокой нагрузкой. Быстрая скорость загрузки сайта дает значительные преимущества как для SEO-мониторинга, так и для пользовательского взаимодействия.

Таким образом, обновление проектов на PHP 8.1 и выше становится неотложной задачей, чтобы обеспечить безопасность, получить доступ к обновлениям и улучшить производительность проекта.

Как правильно осуществить перевод на PHP 8.1

Для успешного перехода на PHP 8.1 следует выполнить следующие шаги:

  • Проверка и обновление git репозитория, а также актуализация тестовой площадки. Убедитесь, что ваш git репозиторий находится в актуальном состоянии и содержит все необходимые изменения. Затем обновите тестовую площадку, чтобы иметь актуальные данные для проведения дальнейших тестов и обновлений.
  • Приобретение и активация лицензии для вашей CMS.
  • Обновление CMS и кода на тестовой площадке. Сначала выполните обновление CMS с текущей версии (например, PHP 7.1) до промежуточной версии (например, PHP 7.4). Затем обновите код на тестовой площадке. После этого обновите CMS и код с версии PHP 7.4 до PHP 8.1.
  • Тестирование и проверка работоспособности на тестовой платформе. После обновления выполните тестирование функциональности и корректности работы вашего проекта на тестовой платформе. Убедитесь, что все функции работают должным образом, что нет ошибок или проблем совместимости.
  • Настройка интерпретатора PHP 8 на боевом сервере и настройка сайтов в панели управления ISP. После успешного тестирования настройте интерпретатор PHP 8 на вашем боевом сервере. Затем настройте ваши сайты в панели управления ISP, чтобы они использовали новую версию PHP.
  • Обновление CMS на боевом сервере и перенос модифицированного кода через git. Выполните обновление CMS на боевом сервере до версии PHP 8.1. Если вы внесли изменения в код, перенесите их на боевой сервер с помощью git или другого инструмента управления версиями.
  • Финальное тестирование на боевом сервере. После обновления и переноса кода выполните финальное тестирование на боевом сервере. Проверьте работу сайтов и выполнение функций. Также рекомендуется провести тесты производительности, чтобы убедиться в корректной работе вашего проекта на новой версии PHP.
  • Завершение работ. После успешного завершения тестов и проверок можно считать процесс перехода на PHP 8.1 завершенным. Убедитесь, что все функции работают правильно и проекты загружаются без проблем.
Перевод проекта на Битриксе на PHP8. Инструкция к применению

Основные проблемы возникающие в ходе обновления

Одна из распространенных ошибок в работе компонентов 1С-Битрикс, которую можно встретить при обновлении PHP до 8 версии, это:

Argument #1 ($value) must be of type Countable|array, null given (0)

Данная ошибка характерна, например, для функций count(), sort(), ksort() и подобных.

Разберемся в чем суть и как можно быстро решить данную проблему на примере функции count():.

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

if (count($arResult["ITEMS"]) > 0) {}

Еще один вариант подобной проверки, который можно встретить в коде:

if (count($arResult["ITEMS"])) {}

Ранее данная конструкция нам возвращала false и в случае если $arResult["ITEMS"] === Array(), и в случае если $arResult["ITEMS"] неопределен. Теперь же возникнет ошибка, если $arResult["ITEMS"] не определен или его значение не может быть "подсчитано", например если значение типа Integer

Быстро исправить данную ошибку можно следующим образом:

if (is_countable($arResult["ITEMS"]) && count($arResult["ITEMS"]) > 0)

Или

if (is_array($arResult["ITEMS"]) && count($arResult["ITEMS"]) > 0)

Главная суть в том, что переменная, передаваемая в функцию count() должна существовать, быть определена и иметь тип, который может быть "посчитан", например Array.

Для быстрого решения этой ошибки в функциях сортировки sort(), ksort() и т.д. можно использовать следующий код:

if (is_array($arResult["ITEMS"])) sort($arResult["ITEMS"]);

А так же возможен вариант явного приведения переменной к необходимому типу:

$arResult["ITEMS"] = (array)$arResult["ITEMS"];

Или

sort((array)$arResult["ITEMS"]);

Но в данном случае нужно понимать, что изначальное значение типа null, boolean, integer будет приведено к типу Array, что не всегда правильно для дальнейшего выполнения кода

Ошибка в функции impode()

Возникает не так часто, как count(), выглядит примерно так:

implode(): Argument #2 ($array) must be of type ?array, string given (0)

Опять же, нет проверки на массив, который подается на вход функции

Решается следующим образом:

if (is_array ($ar)) {

$arRes = implode(';', $ar);

}

Для уверенности лучше рекурсивно прогнать по всем скриптам сайта и поискать вхождения функции implode.

Ошибка с фигурными скобками

В предыдущих версиях PHP к элементам массива можно было обращаться и через квадратные, и через фигурные скобки. В PHP8 поддержка фигурных скобок в этом контексте запрещена.

Ошибка проявляется так:

Fatal error: Array and string offset access syntax with curly braces is no longer supported in путь/к/вашему/скрипту

Решается путем замены фигурных скобок на квадратные

Ошибки с преобразованием типов

Данный класс ошибок проявляется примерно так

Unsupported operand types: string * int (0)

Для решения нужно явно привести типы. Например, так:

$int_value = (int)$maybe_string_value

Раньше было допустимо просто строковое значение умножать на единицу и получать int значение. Теперь - нет.

Ошибка с типами данных в операциях

Раньше можно было выполнять арифметические операции без явного приведения типов. В PHP8 необходимо строго указать тип, иначе появляется ошибка вида

Fatal error: Uncaught Error: Unsupported operand types: string - string

Вместо минуса может быть любой оператор.

Чтобы устранить ошибку, необходимо явно задать тип переменным, например, так:

$a = (int)$b - (int)$c;

Недопустимый тип смещения

Illegal offset type (0)

Подобная ситуация может встречаться в кастомизированных компонентах разработчиков. При вызове компонента в качестве PROPERTY_CODE отдавался пустой массив. Ранее это вызывало лишь warning, теперь же в версии php 8 это стало fatal error. Лечится путем анализа каждого конкретного случая отдельно и не поддается общему решению.

Ошибка в функции number_format

Проявление ошибки:

[TypeError]

number_format(): Argument #1 ($num) must be of type float, string given (0)

В функцию на вход должно подаваться число, если подается строка или null, то теперь выдает ошибку. Решение простое, через явное преобразование типов floatval:

number_format(floatval($price), 2,'.', ' ')

При обновлении PHP до 8 версии в работе сторонних модулей 1С-Битрикс могут также возникнуть ряд ошибок. Рассмотрим как их исправить:

[Ux11] Ошибка описания модуля "название.модуля".

Не установлено соединение с сервером обновлений. [Ux11] Ошибка описания модуля "название модуля".

При возникновении данной ошибки нужно либо обновить модуль до последней версии, либо в файле /bitrix/modules/название.модуля/install/index.php заменить название функции function название_модуля() на function __construct(). После этого ошибка должна уйти.

Для исправления ошибки:

call_user_func_array(): Argument #1 ($function) must be a valid callback, non-static method НазваниеМодуля::МетодКласса() cannot be called statically (0)

Необходимо найти код данного модуля по следующему пути: (/bitrix/modules/название.модуля), определиться с классом в котором возникает данная ошибка и к данному классу приписать служебное слово static, примерно так:

static function МетодКласса().

Вопросы и ответы

Перевод проекта на Битриксе на PHP8. Инструкция к применению

Можно ли выполнить работы без технических знаний?

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

Что делать, если сторонний модуль еще не поддерживает PHP 8?

В таком случае можно рассмотреть несколько вариантов:

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

Будет ли простой сайта во время обновления и какова его продолжительность?

Проведение обновления сайта согласно рекомендациям стоит проводить сначала на тестовой площадке, а затем на боевой. Это поможет сократить простой сайта до минимального уровня (около 15 минут) или вовсе исключить его. Тем не менее, длительность простоя сайта может варьироваться в зависимости от размера и сложности проекта, количества изменений, производительности сервера и других факторов. Важно тщательно планировать и подготавливать проект к обновлению.

Вместо вывода

Мы желаем вам быстрых и эффективных сайтов. А если вы хотите доверить перевод сайта специалистам – оставляйте заявку на сайте компании или пишите нам на почту: office@digimatix.ru

55
3 комментария

Спасибо, очень выручила статья =)
в корзине использовалась функция implode

1
Ответить

Рад, что смогли помочь!

1
Ответить

Нет "панели управления ISP". Есть панель управления ispmanager. А так статья полезная.

Ответить