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

Перевод сайта на 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

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

Все статьи
Региональное продвижение сайта: поддомены или подпапки

Региональное продвижение сайта: поддомены или подпапки

Запросы пользователей в поисковых системах делятся на две категории: геозависимые и геонезависимые. Геозависимые запросы — это...

29.10.2024
97
Битрикс24 vs Microsoft SharePoint: Как выбрать оптимальную платформу для вашего бизнеса?

Битрикс24 vs Microsoft SharePoint: Как выбрать оптимальную платформу для вашего бизнеса?

Эффективность бизнеса во многом зависит от правильного выбора цифровых инструментов, обеспечивающих работу команды и управление документами. Дв...

10.09.2024
847
Внедрение системы управления персоналом и автоматизация: обзор HRM-систем

Внедрение системы управления персоналом и автоматизация: обзор HRM-систем

В современных условиях успешное управление персоналом невозможно без эффективных цифровых инструментов. HRM-системы играют ключевую роль в орга...

06.09.2024
924
ELMA365 CRM – система автоматизации и управления бизнес процессами

ELMA365 CRM – система автоматизации и управления бизнес процессами

ELMA365 CRM – это мощная и гибкая CRM-BPM система, разработанная российской компанией ELMA, специально для удовлетворения потре...

02.09.2024
827
Что делать, если Google Документы перестанут работать? Топ-9 альтернатив для России

Что делать, если Google Документы перестанут работать? Топ-9 альтернатив для России

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

27.08.2024
1452
13 Альтернатив Miro: лучшие сервисы виртуальных досок для совместной работы

13 Альтернатив Miro: лучшие сервисы виртуальных досок для совместной работы

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

22.08.2024
1038
Интеграция Битрикс24 с мессенджерами: преимущества и способы реализации

Интеграция Битрикс24 с мессенджерами: преимущества и способы реализации

В современном бизнесе коммуникация с клиентами становится ключевым фактором успеха. Чтобы эффективно взаимодействовать с клиентами и улучшать п...

21.08.2024
698
Directum RX: Интеллектуальная Платформа для Управления Бизнес-Процессами и Документами

Directum RX: Интеллектуальная Платформа для Управления Бизнес-Процессами и Документами

В современном мире эффективное управление бизнес-процессами и документооборотом играет ключевую роль в достижении конкурентных преимуществ. Ком...

19.08.2024
900