Переход на php 8 битрикс ошибка

 

Пользователь 3228669

Заглянувший

Сообщений: 1
Регистрация: 30.03.2021

#226

02.03.2023 14:29:08

Приветствую, камрады!
Аналогичная ошибка при переключении версии php.

Код
[TypeError] 
call_user_func_array(): Argument #1 ($callback) must be a valid callback, non-static method CSiteCorporate::ShowPanel() cannot be called statically (0)
/home/c/cv61149/public_html/bitrix/modules/main/classes/general/module.php:480
#0: ExecuteModuleEventEx(array)
  /home/c/cv61149/public_html/bitrix/modules/main/include.php:452
#1: require_once(string)
  /home/c/cv61149/public_html/bitrix/modules/main/include/prolog_admin_before.php:34
#2: require_once(string)
  /home/c/cv61149/public_html/bitrix/modules/main/interface/desktop.php:2
#3: require(string)
  /home/c/cv61149/public_html/bitrix/admin/index.php:2

Я открыл general/module.php:480 и там на этой отметке стоит строка (выделил <<<<<<).

Код
      if(is_array($arEvent["TO_METHOD_ARG"]) && count($arEvent["TO_METHOD_ARG"]))
         $args = array_merge($arEvent["TO_METHOD_ARG"], $arParams);
      else
         $args = $arParams;
      class_exists($arEvent["TO_CLASS"]);
      return call_user_func_array(array($arEvent["TO_CLASS"], $arEvent["TO_METHOD"]), $args); <<<<<<<<<<
   }
   else

И как я понял надо поменять на что-то первый аргумент, а именно $arEvent, но меня смущают сомнения, потому что этот аргумент много где используется, в том числе и выше по тексту кода.
Мне только на этой строчке надо как-то его изменить или выше по тексту тоже?

 

Пользователь 306732

Заглянувший

Сообщений: 2
Регистрация: 22.04.2015

#227

02.03.2023 14:46:31

Цитата
написал:
Приветствую, камрады!
Аналогичная ошибка при переключении версии php.

Код
 [ TypeError ] 
call_user_func_array(): Argument # 1  ($callback) must be a valid callback, non-static method CSiteCorporate::ShowPanel() cannot be called statically ( 0 )
/home/c/cv61149/public_html/bitrix/modules/main/classes/general/module.php: 480 
# 0 : ExecuteModuleEventEx(array)
  /home/c/cv61149/public_html/bitrix/modules/main/include.php: 452 
# 1 : require_once(string)
  /home/c/cv61149/public_html/bitrix/modules/main/include/prolog_admin_before.php: 34 
# 2 : require_once(string)
  /home/c/cv61149/public_html/bitrix/modules/main/interface/desktop.php: 2 
# 3 :  require (string)
  /home/c/cv61149/public_html/bitrix/admin/index.php: 2 
 

Я открыл general/module.php:480 и там на этой отметке стоит строка (выделил <<<<<<).

Код
        if (is_array( $arEvent [ "TO_METHOD_ARG" ]) && count( $arEvent [ "TO_METHOD_ARG" ]))
          $args  = array_merge( $arEvent [ "TO_METHOD_ARG" ],  $arParams );
       else 
          $args  =  $arParams ;
      class_exists( $arEvent [ "TO_CLASS" ]);
       return  call_user_func_array( array ( $arEvent [ "TO_CLASS" ],  $arEvent [ "TO_METHOD" ]),  $args ); <<<<<<<<<<
   }
    else  

И как я понял надо поменять на что-то первый аргумент, а именно $arEvent, но меня смущают сомнения, потому что этот аргумент много где используется, в том числе и выше по тексту кода.
Мне только на этой строчке надо как-то его изменить или выше по тексту тоже?

Добрый день! Похожая ошибка была, попробуйте в папке с модулями /bitrix/modules/ найти модуль CSiteCorporate и перед функцией (в вашем случае ShowPanel) добавить static.  

 

Пользователь 1839603

Заглянувший

Сообщений: 2
Регистрация: 12.01.2022

#228

04.03.2023 11:27:23

Здравствуйте. Подскажите, пожалуйста, как исправить такую ошибку при смене версии PHP? Автор модуля

https://marketplace.1c-bitrix.ru/solutions/alin.vision/#tab-comments-link

не отвечает(

Код
[TypeError]
call_user_func_array(): Argument #1 ($callback) must be a valid callback, class "CAlinVision" not found (0)
/bitrix/modules/main/classes/general/module.php:480
#0: call_user_func_array(array, array)
/bitrix/modules/main/classes/general/module.php:480
#1: ExecuteModuleEventEx(array, array)
/bitrix/modules/main/interface/admin_lib.php:909
#2: CAdminMenu->Init(array)
/bitrix/modules/main/interface/desktop.php:6
#3: require(string)
/bitrix/admin/index.php:2
 

Пишите в телеграм кто сам не справится c переходом на PHP8.1 помогу
@toorr2p

 

Евгений Жуков

Администратор

Сообщений: 9219
Баллов: 1783
Регистрация: 05.08.2005

Epic fail — сказать «это так просто» и не суметь сделать

#230

07.03.2023 18:09:36

Цитата
написал:
попробуйте в папке с модулями /bitrix/modules/ найти модуль CSiteCorporate и перед функцией (в вашем случае ShowPanel) добавить static.  

Или обновиться до main 22.500.200

Не надо сверлить зубы через задний проход дрелью от Сваровски

 

Пользователь 108089

Заглянувший

Сообщений: 12
Баллов: 1
Регистрация: 21.11.2011

#231

09.03.2023 14:36:12

Может кому то пригодиться, начал «допиливать» решение от Аспро
Аспро: Корпоративный сайт 2.0 (aspro.allcorp2), версия 1.1.2 (да, не обновлялась очень давно) на PHP 8.1

Смотрите ошибки, если не видно ошибок смотрите исходный код, или ‘debug’ => true

Основная ошибка

Код
Non-static method CCache::CIBlockElement_GetList() cannot be called statically (0)

Файл \bitrix\modules\aspro.allcorp2\classes\general\CCache.php
находим

Код
CCache::CIBlock_GetList

меняем на

Код
(new CCache())->CIBlock_GetList

Основная суть:
замена CCache:: на (new CCache())->

Еще будет в этом же файле:

Код
$resultIDsCount = count($arParams["RESULT"]);

обернем в проверку

Код
if (is_countable($arParams["RESULT"]) && count($arParams["RESULT"]) > 0) {
    $resultIDsCount = count($arParams["RESULT"]);
}

Про $USER->GetID() уже описано

тут

.

Местами добавляем проверку при ошибке
Fatal error: Uncaught TypeError: count(): Argument #1 ($var) must be of type Countable|array, null given in

Код
is_countable($templateData["НАЗВАНИЕ_ПЕРЕМЕННОЙ"]) && 

Далее будут проблемы с CCache:: в файлах типа news.php, CAllcorp2.php и т.п., делаем так же:

Код
(new CCache())->CIBlock_GetList

Массово/автоматически менять не советую, меняйте код и смотрите результат.

 

подскажите, пожалуйста, после обновления до 8.1 перестало заходить в админку: зависает и дальше не идет. Если зайти через скрипт входа, то все ок. Из ошибок только 500-я ошибка в консоли. Сталкивался кто-нибудь? Или как можно увидеть на что ругается?

 

Коллеги, кто нибудь переводил  на 8-ю версию php Битрикс на Ubuntu ?
Сам Ubuntu без проблем на 8.2 перешел, но  в конфигурации сайта  Битрикс  — 7.4., и не нашли конфигурационных файлов  для 8.2. чтобы прописать  сайту..  

 

Пользователь 440465

Заглянувший

Сообщений: 4
Регистрация: 17.12.2015

#234

21.03.2023 11:45:48

Доброго дня!

Пожалуйста, подскажите что можно сделать с этой ошибкой:

Код
[TypeError] 
strlen(): Argument #1 ($str) must be of type string, array given (0)
/var/www/starlayt/data/www/site.ru/bitrix/templates/site/components/bitrix/news.detail/catalog/result_modifier.php:23

Все что я понял, что проблема в этом файле result_modifier.php в куске данного кода который влияет на вывод изображений в слайде и вывод свойств инфоблока

Код
/* result_modifier.php */
Код
if($arResult["DISPLAY_PROPERTIES"]){
    $arResult["CHARACTERISTICS"] = array();
    foreach($arResult["DISPLAY_PROPERTIES"] as $arProp){
        if(!in_array($arProp["CODE"], array("PRICE","FORM_ASK","FORM_QUESTION","FORM_ORDER","LINK_PROJECTS","DOCUMENTS","YAMAP", "GALLERY_LIST"))){
            if(strlen($arProp["VALUE"])){ /* 23 сткрока */
                $arResult["CHARACTERISTICS"][] = $arProp;
            }
        }
    }
}
Код
<!--Вывод изображений-->
                     <?foreach ($arResult['PROPERTIES']['MORE_PHOTO']["VALUE"] as $arItem) {?>
                        <?$file=CFile::GetPath($arItem);
                        $filesize = getimagesize($_SERVER['DOCUMENT_ROOT'].$file);?>
                        <img src="<?=$file?>" border="0" class="img-responsive inline" alt="<?= $arItem["NAME"] ?>" />
                    <? } ?><!-- -->                            <?$file=CFile::GetPath($arItem);
                            $filesize = getimagesize($_SERVER['DOCUMENT_ROOT'].$file);?>
                            <a href="<?=$file?>"
                                data-fancybox="plan"
                                class="img-inside item-link img-responsive"
                                title="<?= $arItem['NAME'] ?>">
                                <span class="zoom"><i class="icon-search"></i></span></a>
                            <img src="<?=$file?>"
                                alt="<?= $arItem["NAME"] ?>"
                                width="<?=$filesize[0]?>"
                                height="<?=$filesize[1]?>"
                                class="img-responsive center-block" />
Код
<!-- Свойства инфоблока -->
                                    <td class="value"><?if(count($arProp["DISPLAY_VALUE"]) > 1){
                                          foreach($arProp["DISPLAY_VALUE"] as $key => $value){
                                            if($arProp["DISPLAY_VALUE"]["YAMAP"]){
                                                    echo $value.", 1";
                                                }
                                                else{
                                                    echo '1 '.$value;
                                                }
                                            }
                                        }
                                        else{
                                            echo $arProp["DISPLAY_VALUE"];
                                        }
                                        ?>
                                    </td>
 

Пользователь 3918986

Посетитель

Сообщений: 65
Баллов: 7
Регистрация: 27.02.2020

#235

21.03.2023 11:53:13

Ilya Gusar,

Сделайте проверку на пустое значение. В php8 это критично.
Так же смотри что у вас приходит на эту функцию, должна быть только строка, без массивов.

https://www.php.net/manual/ru/function.strlen.php

Код
// PHP < 8.0
if (!strlen($text)) {
  echo 'Blank';
}

// PHP >= 8.0
if ($text === null || $text === '')) {
  echo 'empty';
}
 

Добрый день!
Тоже столкнулся с ошибками при переходе на PHP 8.1. Пока вернул на 7.4 и не стал обновлять сайт.
Сейчас собираюсь развернуть тестовую копию сайта на отдельном хостинге и пробовать обновить сайт и перейти на PHP 8.1.

В связи с эти возник вопрос.
Если загрузить обновления Битрикса на тестовой версии (с включенным режимом «Установка для разработки»), и довести его до состояния, что все работает как надо. А потом уже это проделать на основной версии сайта. Не слетит ли возможность обновлений?
Т.е. если я сначала обновляю тестовую версию, а потом захочу обновить основную, не будет ли проблем с обновлениями?

 

Пользователь 6164690

Постоянный посетитель

Сообщений: 82
Баллов: 13
Регистрация: 12.04.2022

#237

21.03.2023 16:52:23

Цитата
Алексей Киселев написал:
не будет ли проблем с обновлениями?

вы о себе мыслите
в формате

Я счастливчик !

традиции этой фирмы ВАС не покорябают?

 

Пользователь 6164690

Постоянный посетитель

Сообщений: 82
Баллов: 13
Регистрация: 12.04.2022

#238

21.03.2023 17:02:21

Цитата
softservice-kmv написал:
и не нашли конфигурационных файлов  для 8.2

А Вы точно
*Золотой партнер*

https://disk.yandex.ru/i/m4t41V_Ik7nqFQ

 

Пользователь 153388

Заглянувший

Сообщений: 3
Регистрация: 18.12.2013

#239

21.03.2023 17:10:48

Здравствуйте, прошу помочь с кодом. При переходе на php 8.2 вылезли ошибки implode и explode. С первой справился, со второй не могу понять.

ошибка

Код
explode(): Argument #2 ($string) must be of type string, array given (0)

сам код

Код
$this->arResult['MIME_TYPES'] = [];
        foreach (explode(',', $this->arParams['MIME_TYPES']) as $item)
        {
            if (strlen(trim($item)) > 0)
                $this->arResult['MIME_TYPES'][] = trim($item);
        }
 

Станислав,

https://www.php.net/manual/ru/function.explode.php

php8: explode() теперь выбрасывает

TypeError

, если параметр separator является пустой строкой («»). Ранее вместо исключения explode() возвращала false.

 

Пользователь 153388

Заглянувший

Сообщений: 3
Регистрация: 18.12.2013

#241

21.03.2023 18:15:18

Цитата
Евгений Уразов:

php8: explode() теперь выбрасывает  

TypeError , если параметр separator является пустой строкой («»). Ранее вместо исключения explode() возвращала false.

У меня separator ведь не пустая строка

 

Пользователь 3918986

Посетитель

Сообщений: 65
Баллов: 7
Регистрация: 27.02.2020

#242

21.03.2023 19:05:33

Цитата
написал:

Цитата
Евгений Уразов:

php8: explode() теперь выбрасывает  

TypeError  , если параметр separator является пустой строкой («»). Ранее вместо исключения explode() возвращала false.

У меня separator ведь не пустая строка

Ай, не то скопировал. Прошу прощения.
В общем, убедитесь, что входящая строка была именно строкой, а не массивом, о чем вам именно в ошибке и пишется.
Либо еще может быть, что передается пустое значение. На это вроде тоже срабатывает

 

Пользователь 153388

Заглянувший

Сообщений: 3
Регистрация: 18.12.2013

#243

21.03.2023 22:46:15

Евгений Уразов,

Цитата
В общем, убедитесь, что входящая строка была именно строкой, а не массивом, о чем вам именно в ошибке и пишется.
Либо еще может быть, что передается пустое значение. На это вроде тоже срабатывает

Благодарю за помощь. Я перевод ошибки понял, просто не понятно, что у меня параметры в MIME_TYPE передаются именно строки, странно что explode их на данном этапе не видит и действительно получает 0. Пришлось обойтись без этой функции :) Я так и не понял как с ней бороться в данном случае.
Заменил на такую конструкцию

Код
$this->arResult['MIME_TYPES'] = is_array($this->arParams['MIME_TYPES']) ? array_values($this->arParams['MIME_TYPES']) : [];

мне помогло, не знаю пригодится ли такой частный случай кому-то ещё :)

 
 

Скачал с сайта bitrixsetup.php начал установку сайта.
в паке Modules нашел

/bitrix/modules/main/classes/general/file.php:2318

if($arFilter[«name»] == «sharpen» && $arFilter[«precision»] > 0)
{

Т.е. проверки на is_array нет в ядре. и сайт выдает:

Cannot access offset of type string on string (0)//bitrix/modules/main/classes/general/file.php:2318

в Последнем ядре.  

 

Пользователь 6164690

Постоянный посетитель

Сообщений: 82
Баллов: 13
Регистрация: 12.04.2022

#246

24.03.2023 16:09:52

Цитата
Михаил Меркулец написал:
Т.е. проверки на is_array нет в ядре

ну и ВАМ не скучно …

у покупающих продукт одна цель
и она не совпадает с целью продающих …

покажите день в календаре когда у Битрикса не было *приколов* с

ДОПИЛИТЕ САМИ — не маленькие

 

Пользователь 77923

Посетитель

Сообщений: 81
Баллов: 7
Регистрация: 07.12.2010

#247

27.03.2023 01:32:11

php 8
битрикс

22.600.100

.

Код
[TypeError] 
call_user_func_array(): Argument #1 ($callback) must be a valid callback, non-static method Olegpro\Handlers\Sale\OrderAjaxComponent::AddYandexMetricsEcommerceCode() cannot be called statically (0)
/home/bitrix/ext_www/ххххххххх.хх/bitrix/modules/main/classes/general/module.php:465
#0: ExecuteModuleEventEx
   /home/bitrix/ext_www/ххххххххх.хх/bitrix/components/bitrix/sale.order.ajax/class.php:6289
#1: SaleOrderAjax->showOrderAction
   /home/bitrix/ext_www/ххххххххх.хх/bitrix/components/bitrix/sale.order.ajax/class.php:6200
#2: SaleOrderAjax->doAction
   /home/bitrix/ext_www/ххххххххх.хх/bitrix/components/bitrix/sale.order.ajax/class.php:6458
#3: SaleOrderAjax->executeComponent
   /home/bitrix/ext_www/ххххххххх.хх/bitrix/modules/main/classes/general/component.php:660
#4: CBitrixComponent->includeComponent
   /home/bitrix/ext_www/ххххххххх.хх/bitrix/modules/main/classes/general/main.php:1062
#5: CAllMain->IncludeComponent
   /home/bitrix/ext_www/ххххххххх.хх/personal/order/make/index.php:137


Ошибка возникает при оформлении заказа.  Подскажите как исправить?

 

Все всем спасибо ! )))
Поправил.

 

Пользователь 5172

Посетитель

Сообщений: 45
Баллов: 8
Регистрация: 19.07.2006

#249

03.04.2023 17:42:31

Коллеги, добрый день!

Может кто сталкивался с такой проблемой и решил, у меня не получается. Код много лет назад был взят из открытых источников и работал, но сейчас выдаёт ошибку.

Код
<!--DOWNLOAD-->
<?if(count($arResult["DISPLAY_PROPERTIES"]["FILE"]["FILE_VALUE"]["SRC"]) == 1):?>

<div class="down-docs"><a class="file" href="<?echo $arResult["DISPLAY_PROPERTIES"]["FILE"]["FILE_VALUE"]["SRC"]?>" target="_blank" >
   <?echo $arResult["DISPLAY_PROPERTIES"]["FILE"]["FILE_VALUE"]["ORIGINAL_NAME"];?>
            <span> — <?= round((intval($arResult["DISPLAY_PROPERTIES"]["FILE"]["FILE_VALUE"]["FILE_SIZE"]) / 1024), 1); ?> Кб</span>
    </a>
</div>
 <?else:?>
<div class="down-docs">    
   <?foreach ($arResult["DISPLAY_PROPERTIES"]['FILE']['FILE_VALUE'] as $pid => $arProperty):?>
      <a class="file" href="<? echo $arProperty['SRC'];?>" target="_blank"  title="Скачать <?echo $arProperty['FILE_NAME'];?>">
         <?echo $arProperty['ORIGINAL_NAME'];?>
             <span> —<?$strKb = $arProperty['FILE_SIZE']/1024; echo round($strKb) . ' Кб';?></span>
       </a>
      <br>
    <?endforeach?>
</div> 
<?endif;?>   
<!--AND DOWNLOAD-->

Понимаю, что проблема в этой строке,

Код
<?if(count($arResult["DISPLAY_PROPERTIES"]["FILE"]["FILE_VALUE"]["SRC"]) == 1):?>

Решение, описанное здесь — https://www.brekot.ru/blog/argument-1-value-must-be-of-type-countable-array/ не помогло. Код используется для вывода загруженных на сайт документов. Первая часть для одного документа, вторая для 2 и более. Не идеал, но ничего лучше не нашла. Буду признательна, если поможете.

 

Пользователь 125253

Постоянный посетитель

Сообщений: 441
Баллов: 37
Регистрация: 09.04.2012

#250

03.04.2023 18:19:59

Татьяна Виноградова,

Код
<? if (is_countable($arResult["DISPLAY_PROPERTIES"]["FILE"]["FILE_VALUE"]["SRC"]) && count($arResult["DISPLAY_PROPERTIES"]["FILE"]["FILE_VALUE"]["SRC"]) == 1) :?>

или

Код
<?if(count((array)$arResult["DISPLAY_PROPERTIES"]["FILE"]["FILE_VALUE"]["SRC"]) == 1):?>

Но наличие можно проверить без сравнения с 1.

Код
<?php if(isset($arResult["DISPLAY_PROPERTIES"]["FILE"]["FILE_VALUE"]["SRC"])): ?>

В административном интерфейсе коробочных версий продуктов «1С-Битрикс» вы могли заметить такое уведомление:

С 01.02.2023 будет ограничена поддержка наших продуктов на PHP версии ниже 8.0. Рекомендуемая версии PHP – 8.1 или выше. Вы используете версию PHP 7.4.33. Пожалуйста, запланируйте обновление PHP или обратитесь в техническую поддержку вашего хостинга.

Почему важно обновить PHP

Версия PHP 7.х объявлена устаревшей и больше не поддерживается, для неё не выпускаются исправления функциональных ошибок и ошибок безопасности. Использование версий PHP ниже 8 крайне не рекомендовано.

Вы не сможете установить обновления коробочных версий продуктов «1С-Битрикс» для исправления ошибок и получения нового функционала, пока не обновите PHP до минимальной версии 8.0 или рекомендованной 8.1 в своем серверном окружении.

Запланируйте обновление PHP до минимальной версии 8.0 или до рекомендуемой PHP 8.1 в самое ближайшее время.

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

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

  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.х не было обновлено ядро и все модули продукта до последних доступных версий в разделе Настройки > Marketplace > Обновление платформы.
  • До перехода на PHP 8.х не были уставлены обновления сторонних решений (они в названии имеют точку) на странице Marketplace > Обновление решений.
  • Разработчик не обновил модуль для поддержки PHP 8.

Основные действия по исправлению ошибок после обновления PHP до 8.х:

  • Вернуться на предыдущую версию PHP 7.x, когда все работало, обновить компоненты системы и сторонние модули, а затем повторно обновить версию PHP до 8.х.
  • Если предыдущие действия не исправили ошибки, то обратиться к разработчику модуля – смотрите раздел выше Куда обращаться в случае ошибок.
  • Временно отключить модуль с ошибкой, переместив его из директории /bitrix/modules.
  • Удалить стороннее решение с ошибкой.

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

[Ux11] Ошибка описания модуля «name.module». Не установлено соединение с сервером обновлений. [Ux11] Ошибка описания модуля «name.module».

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

Решение проблемы:

Исправление в общем случае будет таким: в файле /bitrix/modules/<имя.модуля>/install/index.php код:

function <имя.модуля>()

заменить на:

function __construct()

При выполнении скрипта возникла ошибка. Включить расширенный вывод ошибок можно в файле настроек .settings.php.

Решение проблемы:

Подключиться по FTP/SFTP или зайти в панель хостинга, включить вывод ошибок в файле /bitrix/.settings.php:

'debug' => true,

После чего на сайте будет выведен текст ошибки:

Пример ошибки

Non-static method Super\Functions\CSuperModRep::checkBack() cannot be called statically (0)
/home/bitrix/modules/super.mod/lib/functions/CSuperModRep.php:52
#0: Super\Functions\CSuperModRep::checkRepActive()
/home/bitrix/modules/super.mod/classes/general/CModEvents.php:1621
#1: CModEvents::OnPageStartHandler()
/home/bitrix/modules/main/classes/general/module.php:480
#2: ExecuteModuleEventEx(array)
/home/bitrix/modules/main/include.php:163
#3: require_once(string)
/home/bitrix/modules/main/include/prolog_before.php:14
#4: require_once(string)
/home/bitrix/modules/main/include/prolog.php:10
#5: require_once(string)
/home/bitrix/header.php:1
#6: require(string)
/home/index.php:1

В примере видно, что ошибку отдает сторонний метод CSuperModRep::checkBack() решения super.mod.

Исправление в общем случае будет таким: в коде checkBack() нужно правильно объявить статическую функцию:

function checkBack()

заменить на:

 public static function checkBack()

PHP Fatal error: $GLOBALS can only be modified using the $GLOBALS[$name] = $value syntax in /www/bitrix/modules/main/tools.php

Данная ошибка может появиться после повышения версии PHP до 8.x в случае, если не были установлены все доступные обновления платформы на версии PHP 7.x.

Решение проблемы:

Эта ошибка была исправлена в обновлении главного модуля main 22.100.0.

Поэтому необходимо понизить версию PHP до 7.x, произвести обновление продукта и модулей до последней доступной версии. И только потом повысить версию PHP до 8.х.

[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)…

Эта ошибка может появиться после повышения версии PHP до 8, но уже не очень очевидна:

Пример ошибки

[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)
/var/www//bitrix/modules/main/classes/general/module.php:480
#0: ExecuteModuleEventEx
/var/www/bitrix/modules/main/interface/admin_ui_list.php:1983
#1: CAdminUiContextMenu->Show
/var/www/bitrix/modules/main/interface/admin_ui_list.php:1168
#2: CAdminUiList->ShowContext
/var/www/bitrix/modules/main/interface/admin_ui_list.php:630
#3: CAdminUiList->DisplayFilter
/var/www/bitrix/modules/iblock/admin/iblock_element_admin.php:5217
#4: include(string)
/var/www/bitrix/admin/cat_product_admin.php:3

Из текста ошибки сразу не узнать директорию модуля, но данный метод COMP\BXE\EventHandlers::AdminContextMenuShow() принадлежит стороннему модулю.

Решение проблемы:

Исправление в общем случае будет таким: в коде AdminContextMenuShow() нужно правильно объявить статическую функцию:

function AdminContextMenuShow()

заменить на:

public static function AdminContextMenuShow()

Белый экран после повышения версии PHP до 8.х, а на PHP 7.4 все работает

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

Решение проблемы:

  • Нужно задать в конфигурационном файле PHP: short_open_tag = On.
  • Проверить логи веб-сервера на предмет ошибок и устранить их.
  • Также можно просмотреть ошибки на странице сайта с белым экраном: нажать правую кнопку мыши и выбрать Просмотр кода страницы, пролистать страницу вниз и проверить имеются ли ошибки на ней.

Спасибо, помогло!

Спасибо :)


Это не то, что я ищу


Написано очень сложно и непонятно


Есть устаревшая информация


Слишком коротко, мне не хватает информации


Мне не нравится, как это работает

картинка

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

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

Требуется обновить веб-сервер? Обращайтесь!

Напишите или позвоните — мы поможем. Уточним задачи и на их основе предложим варианты

Сторонние модули

Как показала практика, большинство трудностей возникает, когда на сайте используются сторонние модули: именно они генерируют больше всего ошибок, которые необходимо исправить до обновления на PHP 8.x.
Если это не сделать, есть риск падения как всего сайта, так и отдельных его страниц, использующих тот или иной модуль.

Примеры ошибок и их исправление

  • 1. Ошибка с использованием count(), наиболее часто встречается в условных операторах:

    count(): Argument #1 ($value) must be of type Countable|array, int given

    Причина: вместо массива был передан int. В нашем случае это просто означает, что значение не является исчисляемым функцией count.

    Как исправить: добавить проверку типа.
    Например, для массива:

    if( is_array($arr) ){}

  • 2. Ошибка с использованием фигурных скобок для ключа массива:

    if( $arr{1} ){}

    Причина: данная нотация более не является допустимой и считается ошибкой с выхода php8.

    Как исправить: меняем скобки на квадратные для ключа таким образом:

    if( $arr[1] ){}

  • 3. Использование ключа массива без кавычек, например так, if( $arr[TEST] ){} приведет к ошибке:

    Undefined constant «TEST» (0)

    Причина: данная нотация также более недопустима.

    Как исправить: используем кавычки

    if( $arr[«TEST»] ){}

  • 4. Ошибка со статическими функциями:

    call_user_func_array(): Argument #1 ($function) must be a valid callback, non-static method НазваниеМодуля::МетодКласса() cannot be called statically (0)

    Причина: обращение как к статическому методу, который таковым не является.

    Как исправить: задать static перед функцией, сделав ее статической, если вам это необходимо, например:

    static function МетодКласса().

Устаревшие нотации в функциях

Другой важный момент — устаревшие нотации в функциях внутри init.php, что сразу приведет к падению сайта после обновления, если не исправить. Осложняется ситуация тем, что если сторонние модули можно удалить или обновить (если разработчики их все еще поддерживают), то эти ошибки придется исправлять или отказываться от части важного функционала на сайте.

В большинстве случаев проблемы связаны с более строгим определением «warning» или «error», так, например, стало критичным определение функции как статической с помощью «static» и ключей массива, которые теперь не могут быть указаны в фигурных скобках, как это допускалось ранее. Подобные ошибки исправляются довольно быстро, для этого необходимо зайти в bitrix/.settings.php и в ключе «exception_handling» найти ключ «debug», поставить его в значение «true» для вывода текста ошибки. Затем по логу ошибки будет видно, в какой строке она происходит, после чего их можно исправить. Если ошибка имеет текст, относящий нас к статическому вызову метода, это означает, что при вызове функции у вас пропущено слово «static», т.к. ранее это не было обязательным для обращения к ней.

Важно, что если лог ошибки ведет вас в ядро 1С-Битрикс, то рекомендуется в первую очередь проверить «init.php», т.к. ошибка может быть именно там или в модулях сайта, что не позволяет коду дойти до выполнения самой страницы и отключить важные для ядра функции, из-за чего ошибка и происходит на этапе его выполнения.

Ошибки в «коробке» 1С-Битрикс

Данный вид ошибок встречается редко, т.к. значительная их часть уже исправлена в прошлых обновлениях (если вы устанавливаете ;), однако они все же встречаются. Их можно разделить на два типа:

  • ошибки внутри ядра;
  • ошибки в модулях битрикса.

Наиболее часто они возникают в модулях bitrix.sitecorporate, bitrix.sitepersonal и bitrix.siteinfoportal.

Причина: не обновленный код внутри модуля под php8.

Как исправить: есть три способа, советуем применять их по порядку.1. Установить обновления для указанного в ошибке модуля.2. Обратиться в техподдержку 1С-Битрикс.3. Сделать полную резервную копию сайта, затем убедиться, что это один из модулей демо-коробки, который вы не используете, и только после этого удалить его на странице /bitrix/admin/partner_modules.php. Прибегать к этому пункту стоит, только если у вас есть достаточный опыт работы с 1С-Битрикс и предыдущие пункты не помогли.

Ошибки внутри ядра исправляются как обновлениями, так и «хотфиксами» от разработчиков 1С-Битрикс.

Ошибки в модулях, как правило, связаны с модулями демо-версии, которые устанавливаются вместе с готовым шаблоном сайта и устраняются их удалением, т.к. исправления для них пока не выпущены.

Грядущее обновление

Анонсированное летнее обновление 1С-Битрикс, которое направлено на исправление проблем, происходящих внутри коробки CMS пока не затронуло сторонние модули и самописные функции. Уже вышла его первая часть, которую можно установить без обновления версии PHP, но поддержка разработчиков для старых версий уже не оказывается, даже при купленном продлении лицензии.Однако, исправление ошибок стало уже критичным для установки и обновления CMS, а значит, внести коррективы необходимо как можно скорее.

Итог

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

Другие кейсы

case

Методы защиты от спама, рассылаемого при помощи форм обратной связи веб-сайта

Подробнее

case

Как соблюсти 152-ФЗ для 10+ сайтов, не раздувая бюджет?

Подробнее

case

Почему не пускает в админку 1С-Битрикс?

Подробнее

case

Уязвимость модуля «vote» в CMS 1С-Битрикс

Подробнее

case

Чек-лист для аудита виртуального сервера

Подробнее

case

Почему мы заменили fail2ban на CrowdSec и как это поможет при DDoS-атаках

Подробнее

case

Как и зачем проверять скорость загрузки сайта и валидацию

Подробнее

После перевода нескольких десятков сайтов на 1С Битрикс с php 7.4 на php 8.1 собрал в статье полезные решения ошибок.

Сделаю краткий обзор основных типов ошибок и приведу решения их устранения.

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/*

Теги: php8, TypeError, Fatal error, Error, ошибки php, Undefined constant, ErrorException


В административном интерфейсе коробочных версий продуктов «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, и если в ядре проекта он минимизирован самим продуктом Битрикс и его тех.поддержкой, то в сторонних модулях могут возникнуть проблемы (например, закончилась лицензия стороннего модуля и для получения обновлений этого модуля нужно продлить лицензию). А что касается конкретного кода отдельного проекта — за него отвечает специалист, технически ведущий данный проект. Таким специалистом нередко является владелец сайта, в этом случае при остуствии соотвествующей компетенции вы можете обратиться к нам.

Как обновить 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

Источники

  • Переход на PHP 8.х в коробочных версиях Битрикс24
  • Видео
    «Перевод Битрикс на PHP 8»
  • Миграция с PHP 7.4.x на PHP 8.0.x для разработчиков

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

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Перечень когнитивных ошибок
  • Переход к нэпу означал найдите ошибку
  • Перечень грамматических и речевых ошибок фипи
  • Перехват ошибок ajax
  • Перечень выявленных предупреждений и ошибок проверочным модулем вио

  • Добавить комментарий

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: