Цифровой элемент
15 минут на чтение
5337
Отправь статью на почту?

Перевод сайта на 1C-Битрикс на PHP 8.x: пошаговая инструкция

Подписаться

Вначале года компания 1С-Битрикс выпустила обновления для всех модулей и штатных компонентов, чтобы они могли работать с PHP 8. Пару месяцев назад они начали активно подталкивать разработчиков сторонних решений к обновлению кода своих продуктов. И сейчас это уже практически обязательная мера, вплоть для устранения решения, если оно не поддерживает версию PHP 8. А с августа 2023 года получать обновления платформы 1С-Битрикс не на PHP 8 уже невозможно.

Многие владельцы сайтов на CMS Bitrix уже столкнулись с появлением красной строки в административной панели, призывающей к обновлению.

Строка объявления о необходимости перехода на PHP 8.png

Седьмая версия PHP объявлена устаревшей и не поддерживается. Что это значит?

  1. Для неё не выпускают исправления функциональных ошибок.
  2. Для неё не выпускают решения для исправления ошибок безопасности.
  3. А не обновленные модули платформы подвержены уязвимостям, о которых мы писали в нашей статье ранее «Атака на сайты на 1С-Битрикс»

Получается, что переходить на PHP 8 – обязательно. Но если просто в панели управления хостингом изменить настройки и выбрать актуальную 8-ую версию, то сайт скорее всего сломается. В новой версии PHP изменились требования к написанию кода. То, что было допустимо в версии 7.4, теперь вызывает ошибки и приводит к сбоям работы сайта. Это означает, что весь код на вашем сайте должен соответствовать новым стандартам. Особенно это касается сторонних компонентов, шаблонов и модулей, установленных из Маркетплейса Bitrix. Вот здесь заключается настоящая проблема.

Мы предлагаем два подхода к обновлению – стандартный, рекомендуемый и нестандартный, к которому в некоторых случаях приходится прибегать.

Инструкция для перехода на PHP 8 – стандартный подход

При переходе сайтов, использующих 1C-Битрикс, на PHP 8.x, необходимо учесть ряд особенностей. В данной статье будет представлена пошаговая инструкция, которая поможет вам успешно выполнить этот процесс.

Шаг 1: Подготовка

Перед началом перехода на PHP 8.x, убедитесь, что ваша версия 1C-Битрикс обновлена до последней доступной версии. Для этого вам нужна активная поддержка на вашей лицензии. Если она закончилась, продлите ее, купив ее за 25% от стоимости лицензии. Редакцию вашей лицензии можно проверить в разделе /bitrix/admin/update_system.php?lang=ru в секции "Ответ сервера обновлений".

image003.png <

Шаг 2: Совместимость модулей и компонентов

Перед обновлением PHP до версии 8.x, убедитесь, что все используемые вами модули и компоненты 1C-Битрикс совместимы с этой версией PHP, как платные, так и бесплатные. Для этого вы можете воспользоваться специальным инструментом, предоставляемым 1C-Битрикс – «Проверка системы». Этот инструмент поможет вам определить, какие модули и компоненты нуждаются в обновлении или замене.

Если лицензия на какое-то решение истекла, ее также нужно обновить. Стоимость продления обычно составляет 50% от стоимости решения. Подробности можно найти на странице Маркетплейса, кликнув по названию решения.

Шаг 3: Резервное копирование

Перед обновлением PHP рекомендуется сделать полное резервное копирование вашего сайта, чтобы в случае каких-либо проблем можно было бы вернуться к предыдущей версии.

image005.png


Шаг 4: Обновление PHP до версии 8.x

После выполнения всех подготовительных мероприятий можно приступать к обновлению PHP. Переходите к настройке сервера, выбирая нужную версию PHP.

Если ваш сайт небольшой, относительно новый и использует стандартные компоненты 1С-Битрикс без больших изменений, то он должен запуститься без особых проблем. Однако в большинстве случаев переход требует более глубокой работы. Поэтому рассмотрим альтернативный, нестандартный метод.

Шаг 5: Исправление ошибок в работе сайта

После перевода сайта на работу на PHP 8 вам потребуется проверить работу всех разделов сайта и в случае ошибок - оперативно их устранить.

Часто встречающиеся ошибки:

  • [TypeError] count(): Argument #1 ($value) must be of type Countable|array, null given (0)
  • Non-static method cannot be called statically
  • [TypeError] call_user_func_array(): Argument #1 ($callback) must be a valid callback, non-static method
  • PHP Fatal error: $GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax
  • [TypeError] Cannot access offset of type string on string (0)
  • и так далее…

Какие исправлять стандартные ошибки написано ниже.

Инструкция для перехода на PHP 8 – нестандартный подход

Этот метод комбинирует шаги первого способа с некоторыми дополнительными действиями. Его следует использовать, если:

  • У вас есть уникальный шаблон;
  • Ваш сайт использует кастомные компоненты;
  • Вы работаете с решениями, которые больше не поддерживаются разработчиками, но необходимы для вашего сайта;
  • Вы вносили изменения в ядро Bitrix;
  • У вас нет возможности или желания обновлять лицензии на сторонние решения.

Обратите внимание, что лицензия на 1С-Битрикс должна быть активной в любом случае. Внесение изменений в ядро – это рискованный шаг.

Для начала вам надо выполнить шаги 1 и 3 из стандартного метода.

  1. Создайте полную резервную копию вашего сайта.
  2. Обновите ядро, как в идеальном сценарии. Если вы вносили изменения в ядро или штатные компоненты, перенесите их в папку local.
  3. Обновите все установленные сторонние решения. Если вы вносили изменения в эти решения, также переносите изменения в local.
  4. Включите вывод ошибок в настройках, в файле /bitrix/.settings.php.
  5. Настройте хостинг и активируйте PHP 8.

Как исправлять типовые ошибки перехода с PHP 7.x на PHP 8.x

1. Не статичный метод вызывается статично


[TypeError] 
call_user_func_array(): Argument #1 ($callback) must be a valid callback, non-static method CKladr::SetLocation() cannot be called statically (0)
Решение:
Находим файл, в котором прописан метод CKladr::SetLocation и указываем у него static
Пример:

public static function SetLocation(){
...
}

2. Нет проверки типа данных при использовании функции для определенно типа данных

php 8 стал более строгий, теперь переменные нужно проверять перед использованием методом, относящихся к определенному типу данных


1. Fatal error:  Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, bool given in /home/bitrix/ext_www/cin.ru/bitrix/modules/security/classes/general/antivirus.php:559
Решение:
Делаем проверку типа данных.
Пример 1. Проверка массива:

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

[TypeError] 
array_key_exists(): Argument #2 ($array) must be of type array, string given (0)

[TypeError] 
count(): Argument #1 ($value) must be of type Countable|array, null given (0)

[TypeError] 
array_filter(): Argument #1 ($array) must be of type array, bool given (0)

[TypeError] 
array_multisort(): Argument #1 ($array) must be an array or a sort flag (0)

[TypeError] 
array_unique(): Argument #1 ($array) must be of type array, null given (0)

[TypeError] 
in_array(): Argument #2 ($haystack) must be of type array, bool given (0)

Решение:

if(is_array($ar) && count($ar)>5){
...
}
Пример 3. Проверка массива:

[TypeError] 
array_key_exists(): Argument #2 ($array) must be of type array, string given (0)

Решение:

if(!array_key_exists($arFirstLvl, $arItem['IBLOCK_SECTION_ID'])){

меняем на 

if(is_array($arItem['IBLOCK_SECTION_ID']) && !array_key_exists($arFirstLvl, $arItem['IBLOCK_SECTION_ID'])){

Пример 4. Проверка массива:

[TypeError] 
array_filter(): Argument #1 ($array) must be of type array, bool given (0)

Решение:

$arItem['PROPERTIES']['SIMILAR_SWITCH']['VALUE'] = array_filter($arItem['PROPERTIES']['SIMILAR_SWITCH']['VALUE']);
	
меняем на 
	
if(is_array($arItem['PROPERTIES']['SIMILAR_SWITCH']['VALUE'])){
	$arItem['PROPERTIES']['SIMILAR_SWITCH']['VALUE'] = array_filter($arItem['PROPERTIES']['SIMILAR_SWITCH']['VALUE']);
}
Пример 5. Проверка числа:

[TypeError] 
gmdate(): Argument #2 ($timestamp) must be of type ?int, string given (0)

Решение:

header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
		
to

if(intval($lastModified)>0){
	header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
}

3. Не статичный метод не может быть определен как статичный


[Error] 
Non-static method Countrymask\Unitools::isAdminPage() cannot be called statically (0)
Возможно метод по ошибке установлен как static

заменяем 
public static function Location(){
...
}

на 

public function Location(){
...
}

4. Не отображаются наименования сторонних модулей в меню настроек модулей

В стороннем модуле может не быть конструктора и лэнги задаются в методе одноименным с классом. В php 7.4 это работало, но в php 8.1 нужно использовать __construct():

	function recaptchafree()
	{
		$this->MODULE_NAME = GetMessage("CAPTCHA_INSTALL_NAME");
		$this->MODULE_DESCRIPTION = GetMessage("CAPTCHA_INSTALL_DESCRIPTION");
                ...
	}
заменяем на 

	function __construct()
	{
		$this->MODULE_NAME = GetMessage("CAPTCHA_INSTALL_NAME");
		$this->MODULE_DESCRIPTION = GetMessage("CAPTCHA_INSTALL_DESCRIPTION");
                ...
	}

5. Ключ в массиве, заданный без кавычек, будет обрабатываться как константа.

Если константа не определена, то появляется соответствующая ошибка:

Undefined constant "HTTP_USER_AGENT" (0)
Самая частая ошибка, обязательно у ключа в ассоциативном массиве должны быть кавычки:

$_SERVER[HTTP_USER_AGENT] 

заменяем на 

$_SERVER['HTTP_USER_AGENT'] 

6. В некоторых функциях обязательно должен быть задан аргумент.


[ArgumentCountError] 
mktime() expects at least 1 argument, 0 given (0)
Пример:

заменяем 
mktime() 
на 
mktime(0)

7. Синтаксис доступа к смещению массива и строки с фигурными скобками больше не поддерживается.


[ErrorException] E_COMPILE_ERROR
Array and string offset access syntax with curly braces is no longer supported (0)
Пример:

$type0 = $type{0};	 
	
меняем на 

if(!is_array($type[0])){	
      $type0 = $type[0];
}	

8. На php 8.0 работает, ошибки php показывает, но на php 8.1 выдает 502 Bad Gateway

В модуле Проактивная защита ставим исключение: Маски исключения: /bitrix/*

Другие ошибки

 Ошибка:Undefined constant BX_RESIZE_PROPORTIONAL_ALT (0)
Код: $arImg = CFile::ResizeImageGet($arSubItemImg, array('width' => 60, 'height' => 60), BX_RESIZE_PROPORTIONAL_ALT);
Решение: $arImg = CFile::ResizeImageGet($arSubItemImg, array('width' => 60, 'height' => 60), BX_RESIZE_IMAGE_PROPORTIONAL_ALT);
 Ошибка:implode(): Argument #2 ($array) must be of type ?array, string given (0)
Код: $arImg = $arOfferProps = implode(';', $arParams['OFFERS_CART_PROPERTIES']);
Решение: $offersСartProperties = !empty($arParams['OFFERS_CART_PROPERTIES']) && is_array($arParams['OFFERS_CART_PROPERTIES']) ? $arParams['OFFERS_CART_PROPERTIES'] : [];
	 $arOfferProps = implode(';', $offersСartProperties);
Ошибка:in_array(): Argument #2 ($haystack) must be of type array, bool given (0)
Код: if(in_array($arCurrentOffer['TREE'][$strName], $arShowValues))
Решение: if(is_array($arShowValues) && in_array($arCurrentOffer['TREE'][$strName], $arShowValues))

Проверка работоспособности сайта

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

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

Если при проверке системы, вы видите только белый экран, откройте исходный код сочетанием клавиш Ctrl + U и посмотрите каждую страницу сайта.

Обязательно проведите тщательную проверку интерактивности веб-ресурса. Выполните все функциональные тесты, включая отправку форм, проверку работы калькуляторов и использование поиска на сайте.

Также не забудьте проверить наличие ошибок в консоли (F12) браузера.

Для более глубокой проверки сайта, воспользуйтесь стандартным инструментом в разделе /bitrix/admin/site_checker.php?lang=ru. Здесь вы можете найти полезные подсказки и рекомендации в случае возникновения проблем.

Вывод

Переход сайтов 1C-Битрикс на PHP 8.x может быть сложным процессом, но при правильном подходе и последовательности действий вы сможете успешно выполнить его и обеспечить работу вашего сайта на самой новой версии PHP.

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

Команда компании «Цифровой Элемент» очень давно работает с сайтами на платформе 1С-Битрикс, поэтому наши специалисты обладают профессиональными навыками и основательным опытом в разработке и оптимизации сайтов на этой платформе. Мы предполагаем, какие проблемы могут возникнуть при переходе на PHP 8, сможем их минимизировать или вовсе полностью избежать. А это поможет избежать ненужного простоя сайта и потери потенциальных клиентов.

Обязательно к прочтению:

Мне не нравится
Россия, Челябинская область, Челябинск, ул. Энтузиастов, 2, оф. 200 Телефон: +7 (351) 220-45-35

Читайте в нашем блоге

Все статьи
Обзор ключевых инструментов digital-маркетинга

Обзор ключевых инструментов digital-маркетинга

В digital-маркетинге существует множество инструментов, которые помогают специалистам достигать своей целевой аудитории. Давайте рассмотрим как...

29.03.2024
142
Что будет, если не продлить лицензию Битрикс24?

Что будет, если не продлить лицензию Битрикс24?

Битрикс24 – это платформа, которая помогает организовать и автоматизировать бизнес-процессы компании, обеспечивая удобство использ...

04.03.2024
236
Как настроить редирект через .htaccess

Как настроить редирект через .htaccess

Редирект можно настроить разными способами: в панели управления хостингом, через код HTML, через PHP, с помощью web.config, через .htaccess, а ...

04.03.2024
190
Как восстановить доступ в панель администрирования сайта на 1С-Битрикс?

Как восстановить доступ в панель администрирования сайта на 1С-Битрикс?

Через панель администратора сайта на 1С-Битрикс можно управлять настройками сайта, менять контент и так далее. Также там можно заводить новых п...

21.12.2023
869
Как создать аккаунт разработчика в App Store, Google Play, AppGallery

Как создать аккаунт разработчика в App Store, Google Play, AppGallery

Перед тем, как опубликовать мобильное приложение в сторе, нужно зарегистрировать аккаунт разработчика. Мы поддерживаем клиента на протяжении вс...

08.12.2023
2200
Файлы-куки: как правильно информировать пользователей и избежать штрафов

Файлы-куки: как правильно информировать пользователей и избежать штрафов

Веб-аналитика и маркетинг сегодня немыслимы без использования куки-файлов (cookies) - небольших фрагменты данных, которые веб-сайты сохраняют в...

06.12.2023
536
Безопасность сайта: поиск вирусов и троянов

Безопасность сайта: поиск вирусов и троянов

Сегодня атаки злоумышленников и вредоносные программы стали неотъемлемой частью нашей повседневной жизни, а обеспечение безопасности данных и п...

20.11.2023
861
«Цифровой Элемент» принял участие в Русском Экономическом Форуме

«Цифровой Элемент» принял участие в Русском Экономическом Форуме

Форум посвящен масштабным вопросам развития суверенной экономики России в XXI веке. Среди основных тем: импортозамещение, технологическое разви...

13.11.2023
393