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

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

Блог

TОП-40 плагинов Figma
TОП-40 плагинов Figma

Для создания дизайнов и прототипов большинство современных дизайнеров использует Figma. Его основное преимущество перед другими графическими прогр...

11.мар.2021
140942
Микроразметка schema.org
Микроразметка schema.org

Schema.org – микроразметка, позволяющая структурировать данные на сайте для поисковых систем. С ее помощью поисковые системы понимают, какие данные...

28.мая.2019
131136
Как попасть на Яндекс.Карты, Google.Карты, 2GIS
Как попасть на Яндекс.Карты, Google.Карты, 2GIS

Если ваша компания ведет бизнес офлайн, размещение на Яндекс.Картах и Google и 2GIS поможет рассказать об этом потенциальным клиентам. Присутствие...

17.июл.2019
105781
404 ошибка – страница не найдена
404 ошибка – страница не найдена

404 ошибка (страница не найдена) – это ответ сервера, который возникает, когда сервер не может отобразить запрашиваемую страницу по указанному адре...

13.авг.2019
50892
Топ 10 лучших сервисов для онлайн-опросов
Топ 10 лучших сервисов для онлайн-опросов

Как провести онлайн-опрос аудитории легко и не затратить на составление анкет уйму времени? Ответ прост – используйте готовые формы, предлагаемые ...

28.июл.2022
25372
Семантика сайта
Семантика сайта

Семантическое ядро – это набор фраз, соответствующих поисковым запросам пользователей в поисковых системах, которые характеризуют определенную тема...

21.окт.2019
23765
Сброс кеша DNS в Google Chrome
Сброс кеша DNS в Google Chrome

Для сброса кеша DNS в Google Chrome: Введите в адресной строке браузера chrome://net-internals/#dns и нажмите кнопку Clear host cache; Зат...

31.янв.2020
20867
Как составить ТЗ на разработку сайта
Как составить ТЗ на разработку сайта

ТЗ (техническое задание) – очень полезный документ, в котором описаны все разделы сайта, все элементы страницы и функциональность всех модулей. Пол...

14.мая.2021
19098
Микроразметка Open Graph
Микроразметка Open Graph

Open Graph – стандарт микроразметки, который позволяет формировать превью сайта при публикации в социальных сетях. Стандарт Open Graph был р...

05.ноя.2019
18342
Как предоставить гостевой доступ к Яндекс Директ и Google Adwords
Как предоставить гостевой доступ к Яндекс Директ и Google Adwords

Контекстная реклама — один из самых простых и быстрых способов увеличения посещений веб-сайта. Особенностью этого инструмента является понятность р...

19.янв.2021
16192