В административном интерфейсе коробочных версий продуктов «1С-Битрикс» вы могли заметить такое уведомление:
С 01.02.2023 будет ограничена поддержка наших продуктов на PHP версии ниже 8.0. Рекомендуемая версии PHP – 8.1 или выше. Вы используете версию PHP 7.4.33. Пожалуйста, запланируйте обновление PHP или обратитесь в техническую поддержку вашего хостинга.
Почему важно обновить PHP
Версия PHP 7.х объявлена устаревшей
и больше не поддерживается, для неё не выпускаются исправления функциональных ошибок и ошибок безопасности. Использование версий PHP ниже 8 крайне не рекомендовано, т.к. сайты с версиями ниже 8 теперь становятся мишенью злоумышленников.
Вы не сможете установить обновления коробочных версий продуктов «1С-Битрикс» для исправления ошибок и получения нового функционала, пока не обновите PHP до минимальной версии 8.0 или рекомендованной 8.1 в своем серверном окружении.
Переход на обновление PHP до минимальной версии 8.0 можно запланировать и перейти с минимальными потерями и/или простоями в работе сайта.
Риски при обновлении версии PHP до 8.х
В интернет-проект на битриксе содержит несколько условно-выделяемых сущностей:
- Ядро проекта - это сам продукт Битрикс. за ошибки и несовместимости отвечает компания Битрикс. На момент написания статьи ядро битрикса стабилизировано в работе на версии php 8.x
- Сторонние модули, установление из маркетплейса. За эти модули отвечают их авторы, часть решений еще не переведено для совместимости работы на php8 на момент написания статьи
- И наконец, код конкретного проекта
Во всех этих инструментах заложен потенциальный риск перехода на версию 8.x, и если в ядре проекта он минимизирован самим продуктом Битрикс и его тех.поддержкой, то в сторонних модулях могут возникнуть проблемы (например, закончилась лицензия стороннего модуля и для получения обновлений этого модуля нужно продлить лицензию). А что касается конкретного кода отдельного проекта - за него отвечает специалист, технически ведущий данный проект. Таким специалистом нередко является владелец сайта, в этом случае при остуствии соотвествующей компетенции вы можете обратиться к нам.
Как обновить PHP
Обновление версии PHP необходимо произвести поэтапно.
Очень желательно провести эту операцию на тестовой площадке, т.к. можно заранее внести исправления в код, чтобы он работал и на версии php8 и на более низких версиях языка, а также понять, какие из модулей вызывают ошибки и требуют либо обновления, либо их удаления, либо исправления обок в коде. Однако такая предварительная "разведка" занимает больше времени, соответственно, и услуга по переходу на новую версию php8 будет стоить дороже.
Можно проводить обновления и на уже работающем проекте ("в бою") без предварительной проверки, но какой бы способ не оказался оптимальным, в любом случае сперва нужно выполнить резервное копирование.
Для обновления нужно обратиться к вашему системному администратору или в техподдержку вашего хостинга, и скорее всего вам потребуется разработчик проекта для исправления ошибок в коде для нового окружения php8.
-
Обязательно создайте резервную копию вашей установки. Это может быть как резервная копия средствами продукта, так и полностью всего сервера, например виртуальной машины VMBitrix.
-
Обновите ядро и все модули продукта до последних доступных версий в разделе Настройки > Marketplace > Обновление платформы.
-
Обновите все сторонние решения из Маркетплейса до последних доступных версий в разделе Настройки > Marketplace > Обновление решений.
-
Обновите версию PHP до минимальной 8.0 или рекомендованной 8.1 на своем сервере.
Если вы используете виртуальную машину VMBitrix, то обновить PHP можно через меню VMBitrix: 1. Manage servers in the pool - 8. Update PHP and MySQL. Подробнее читайте в отдельном курсе.
- Еще раз проверьте и установите все доступные обновления платформы и решений из Маркетплейса.
Куда обращаться в случае ошибок при обновлении версии PHP до 8.х
-
Если после обновлений PHP появятся ошибки в работе стандартных модулей продуктов «1С-Битрикс», то обратитесь в Поддержку24.
Также по модулям из Маркетплейса, в названия которых содержатся bitrix.*
, нужно обращаться в Поддержку24, например:
bitrix.eshop
bitrix.sitecommunity
bitrix.sitecorporate
bitrix.siteinfoportal
bitrix.sitepersonal
bitrix.learningtemplates
-
По ошибкам в сторонних модулях из Маркетплейса обращайтесь к разработчикам модуля, их контакты указаны на странице этого модуля во вкладке «Поддержка».
-
По ошибкам в коде именно вашего проекта вам необходимо обратиться к автору либо текущему техническому специалисту, поддерживающему проект.
Также вы можете обратиться и в нашу тех.поддержку, мы производим исправление ошибок для окружения php 8, в том числе и в сторонних модулях.
Примеры частых ошибок и их решения
Возможные причины ошибок после обновления до PHP 8.х:
- До перехода на PHP 8.х не было обновлено ядро и все модули продукта до последних доступных версий в разделе Настройки > Marketplace > Обновление платформы.
- До перехода на PHP 8.х не были уставлены обновления сторонних решений (они в названии имеют точку) на странице Marketplace > Обновление решений.
- Разработчик не обновил модуль для поддержки PHP 8.
Основные действия по исправлению ошибок после обновления PHP до 8.х:
- Вернуться на предыдущую версию PHP 7.x, когда все работало, обновить компоненты системы и сторонние модули, а затем повторно обновить версию PHP до 8.х.
- Если предыдущие действия не исправили ошибки, то обратиться к разработчику модуля – смотрите раздел выше Куда обращаться в случае ошибок.
- Временно отключить модуль с ошибкой, переместив его из директории
/bitrix/modules
.
- Удалить стороннее решение с ошибкой.
Стоить отметить, что в примерах даны лишь решения ошибок для конкретного модуля. Каждая ошибка должна рассматриваться разработчиком индивидуально.
Примеры ошибок в коде после обновления до PHP 8.х
Версия php8 более строго типизированная и сигнатуры функций языка не терпят передачу в них других типов переменных (в отличие от предыдущих версий php). Чаще всего проблемы с типами возникают в шаблонах компонент (т.е. в коде конкретного проекта, см. пункт про риски)
Здесь приведены наиболее часто встречающиеся ошибки. Эта часть статьи предназначена больше техническим специалистам.
1/
Первым пунктом мы рекомендуем включить логирование ошибок, а также их вывод на экран. Для анализа проекта на ошибки после запуска в случае логов и оперативного исправления в случае их вывода на экран.
Подключиться по FTP/SFTP или зайти в панель хостинга, включить вывод ошибок в файле /bitrix/.settings.php
:
'debug' => true,
И включить логирование ошибок:
'log' =>
array(
'settings' =>
array(
'file' => '/home/bitrix/__php_error.log',
'log_size' => 1000000,
),
),
2/
Типичная распростаненная ошибка - это вызов события или любого другого метода, не объявленного статическим, через двойное двоеточие (как статический).
Non-static method Super\Functions\CSuperModRep::checkBack() cannot be called statical
[TypeError] call_user_func_array(): Argument #1 ($callback) must be a valid callback, non-static method COMP\BXE\EventHandlers::AdminContextMenuShow() cannot be called statically (0)...
Исправление в общем случае будет таким: в коде нужно правильно объявить статический метод:
function checkBack()
function AdminContextMenuShow()
заменить на:
public static function checkBack()
public static function AdminContextMenuShow()
3/
Следующие ошибки связаны с изменением в системе типов у php8:
3.1/
count(): Argument #1 ($value) must be of type Countable|array, string given (0)
Код if (count($arProp["DISPLAY_VALUE"]) > 1) заменить на:
// еще интересный пример, как можно быть в рhp8
(array)'' // будет преобразовано в ['']
// такие проверки теперь через array_filter - оставляет в массиве только численные элементы
count( array_filter((array)'') ); // int(0)
// т.е. в шаблоне компонента можно писать:
count( array_filter((array)$arMayVoid) ); // вместо count($arMayVoid)
3.2/
array_key_exists(): Argument #2 ($array) must be of type array, null given (0)
Код if (array_key_exists($val["PRODUCT_ID"], $arMeasures))заменить на:
if (array_key_exists($val["PRODUCT_ID"], (array)$arMeasures))
4/
Неопределенные константы теперь не преобразуются в строки, а выкидывается ошибка.
4.1/
Fatal error: Uncaught Error: Undefined constant "ERROR_404"
if (ERROR_404 == 'Y')
// заменить на
if (defined('ERROR_404') && ERROR_404 == 'Y')
4.2/
Соответственно, индексы массивов всегда нужно закавычивать:
$MESS[FIELD]
// заменить на
$MESS['FIELD']
5/
[Ux11] Ошибка описания модуля "name.module". Не установлено соединение с сервером обновлений. [Ux11] Ошибка описания модуля "name.module".
Ошибка может появиться после повышения версии PHP до 8.0 и выше. Сайт при этом работает, но установить или обновить другие решения нельзя, пока сохраняется ошибка.
Решение проблемы:
Исправление в общем случае будет таким: в файле /bitrix/modules/<имя.модуля>/install/index.php
код:
function <имя.модуля>()
заменить на:
function __construct()
6/
Php8 больше не поддерживает конструкцию языка each.
list($dataKey, $dataValue) = each($this->data);
// заменить на:
$dataKey = key($this->data);
$dataValue = current($this->data);
next($this->data);
7/
Старые зарегистрированные события сторонних модулей в табилце b_module_to_module
[TypeError]
call_user_func_array(): Argument #1 ($callback) must be a valid callback, class "\Yenisite\Core\Events\Main" not found (0)
/home/bitrix/www/bitrix/modules/main/classes/general/module.php:480
#0: ExecuteModuleEventEx
/home/bitrix/www/bitrix/modules/main/include/epilog_admin_after.php:22
решение:
удалить записи о событиях в таблице b_module_to_module
mysql> delete from b_module_to_module where TO_MODULE_ID LIKE 'yenisite.core';
Query OK, 1 row affected (0.00 sec)
и почистить управляемый кеш, удалить папку bitrix/managed_cache/MYSQL/b_module_to_module
Источники
Назад в раздел