+7 495 008 8452 пн.-пт. 10:00 – 17:00
Загрузка...
В административном интерфейсе коробочных версий продуктов «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.х

В интернет-проект на битриксе содержит несколько условно-выделяемых сущностей:
  1. Ядро проекта - это сам продукт Битрикс. за ошибки и несовместимости отвечает компания Битрикс. На момент написания статьи ядро битрикса стабилизировано в работе на версии php 8.x
  2. Сторонние модули, установление из маркетплейса. За эти модули отвечают их авторы, часть решений еще не переведено для совместимости работы на php8 на момент написания статьи
  3. И наконец, код конкретного проекта
Во всех этих инструментах заложен потенциальный риск перехода на версию 8.x, и если в ядре проекта он минимизирован самим продуктом Битрикс и его тех.поддержкой, то в сторонних модулях могут возникнуть проблемы (например, закончилась лицензия стороннего модуля и для получения обновлений этого модуля нужно продлить лицензию). А что касается конкретного кода отдельного проекта - за него отвечает специалист, технически ведущий данный проект. Таким специалистом нередко является владелец сайта, в этом случае при остуствии соотвествующей компетенции вы можете обратиться к нам.

Наша тех.поддержка производит переход на версию php8, собирая все это воедино и интегрируя все эти три сущности пока проект не заработает на php8 без ошибок.

Как обновить PHP

Обновление версии PHP необходимо произвести поэтапно. 

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

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

Для обновления нужно обратиться к вашему системному администратору или в техподдержку вашего хостинга, и скорее всего вам потребуется разработчик проекта для исправления ошибок в коде для нового окружения php8.

  1. Обязательно создайте резервную копию вашей установки. Это может быть как резервная копия средствами продукта, так и полностью всего сервера, например виртуальной машины VMBitrix.

  2. Обновите ядро и все модули продукта до последних доступных версий в разделе Настройки > Marketplace > Обновление платформы.

    Обновить платформу
  3. Обновите все сторонние решения из Маркетплейса до последних доступных версий в разделе Настройки > Marketplace > Обновление решений.

    Обновить установленные решения
  4. Обновите версию PHP до минимальной 8.0 или рекомендованной 8.1 на своем сервере.

    Если вы используете виртуальную машину VMBitrix, то обновить PHP можно через меню VMBitrix: 1. Manage servers in the pool - 8. Update PHP and MySQL. Подробнее читайте в отдельном курсе.

  5. Еще раз проверьте и установите все доступные обновления платформы и решений из Маркетплейса.

Куда обращаться в случае ошибок при обновлении версии 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) заменить на:

if (is_array($arProp["DISPLAY_VALUE"]) && count($arProp["DISPLAY_VALUE"]) > 1)
// OR https://www.php.net/manual/ru/function.is-countable.php
if (is_countable($arProp["DISPLAY_VALUE"]) && 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


Источники



Назад в раздел

Подписаться на новые материалы раздела:
Загрузка...