Перевод проекта на Битриксе на PHP8. Инструкция к применению
Всем привет, это команда DIGIMATIX. Компания Битрикс прекратила поддержку и обновление продуктов на PHP версии ниже 8.0. Что произошло и чем это грозит для владельцев ресурсов – ответим в этой статье.
Кому и зачем?
Все проекты, созданные с использованием продуктов 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 завершенным. Убедитесь, что все функции работают правильно и проекты загружаются без проблем.
Основные проблемы возникающие в ходе обновления
Одна из распространенных ошибок в работе компонентов 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 МетодКласса().
Вопросы и ответы
Можно ли выполнить работы без технических знаний?
Данные работы требуют участия технических специалистов, так как они включают в себя внесение изменений в код проекта.
Что делать, если сторонний модуль еще не поддерживает PHP 8?
В таком случае можно рассмотреть несколько вариантов:
- Если модуль не обязателен для работы проекта, можно исключить его использование или выбрать альтернативные решения.
- Протестировать работу модуля и внести необходимые корректировки самостоятельно. Если у вас есть достаточные знания и опыт, можно провести тестирование модуля на PHP 8 и внести необходимые изменения в код, чтобы обеспечить его совместимость с новой версией.
- Обратиться к разработчику модуля для получения информации о сроках запуска поддержки PHP 8.
Будет ли простой сайта во время обновления и какова его продолжительность?
Проведение обновления сайта согласно рекомендациям стоит проводить сначала на тестовой площадке, а затем на боевой. Это поможет сократить простой сайта до минимального уровня (около 15 минут) или вовсе исключить его. Тем не менее, длительность простоя сайта может варьироваться в зависимости от размера и сложности проекта, количества изменений, производительности сервера и других факторов. Важно тщательно планировать и подготавливать проект к обновлению.
Вместо вывода
Мы желаем вам быстрых и эффективных сайтов. А если вы хотите доверить перевод сайта специалистам – оставляйте заявку на сайте компании или пишите нам на почту: office@digimatix.ru
Спасибо, очень выручила статья =)
в корзине использовалась функция implode
Рад, что смогли помочь!
Нет "панели управления ISP". Есть панель управления ispmanager. А так статья полезная.