|
Пользователь 3228669 Заглянувший Сообщений: 1 |
#226 02.03.2023 14:29:08 Приветствую, камрады!
Я открыл general/module.php:480 и там на этой отметке стоит строка (выделил <<<<<<).
И как я понял надо поменять на что-то первый аргумент, а именно $arEvent, но меня смущают сомнения, потому что этот аргумент много где используется, в том числе и выше по тексту кода. |
||||
|
Пользователь 306732 Заглянувший Сообщений: 2 |
#227 02.03.2023 14:46:31
Добрый день! Похожая ошибка была, попробуйте в папке с модулями /bitrix/modules/ найти модуль CSiteCorporate и перед функцией (в вашем случае ShowPanel) добавить static. |
||||||
|
Пользователь 1839603 Заглянувший Сообщений: 2 |
#228 04.03.2023 11:27:23 Здравствуйте. Подскажите, пожалуйста, как исправить такую ошибку при смене версии PHP? Автор модуля https://marketplace.1c-bitrix.ru/solutions/alin.vision/#tab-comments-link не отвечает(
|
||
|
Пишите в телеграм кто сам не справится c переходом на PHP8.1 помогу |
|
|
Евгений Жуков
Администратор Сообщений: 9219 Epic fail — сказать «это так просто» и не суметь сделать |
#230 07.03.2023 18:09:36
Или обновиться до main 22.500.200 Не надо сверлить зубы через задний проход дрелью от Сваровски |
||
|
Пользователь 108089 Заглянувший Сообщений: 12 |
#231 09.03.2023 14:36:12 Может кому то пригодиться, начал «допиливать» решение от Аспро Смотрите ошибки, если не видно ошибок смотрите исходный код, или ‘debug’ => true Основная ошибка
Файл \bitrix\modules\aspro.allcorp2\classes\general\CCache.php
меняем на
Основная суть: Еще будет в этом же файле:
обернем в проверку
Про $USER->GetID() уже описано тут . Местами добавляем проверку при ошибке
Далее будут проблемы с CCache:: в файлах типа news.php, CAllcorp2.php и т.п., делаем так же:
Массово/автоматически менять не советую, меняйте код и смотрите результат. |
||||||||||||||
|
подскажите, пожалуйста, после обновления до 8.1 перестало заходить в админку: зависает и дальше не идет. Если зайти через скрипт входа, то все ок. Из ошибок только 500-я ошибка в консоли. Сталкивался кто-нибудь? Или как можно увидеть на что ругается? |
|
|
Коллеги, кто нибудь переводил на 8-ю версию php Битрикс на Ubuntu ? |
|
|
Пользователь 440465 Заглянувший Сообщений: 4 |
#234 21.03.2023 11:45:48 Доброго дня! Пожалуйста, подскажите что можно сделать с этой ошибкой:
Все что я понял, что проблема в этом файле result_modifier.php в куске данного кода который влияет на вывод изображений в слайде и вывод свойств инфоблока
|
||||||||||
|
Пользователь 3918986 Посетитель Сообщений: 65 |
#235 21.03.2023 11:53:13 Ilya Gusar, Сделайте проверку на пустое значение. В php8 это критично. https://www.php.net/manual/ru/function.strlen.php
|
||
|
Добрый день! В связи с эти возник вопрос. |
|
|
Пользователь 6164690 Постоянный посетитель Сообщений: 82 |
#237 21.03.2023 16:52:23
вы о себе мыслите Я счастливчик ! традиции этой фирмы ВАС не покорябают? |
||
|
Пользователь 6164690 Постоянный посетитель Сообщений: 82 |
#238 21.03.2023 17:02:21
А Вы точно https://disk.yandex.ru/i/m4t41V_Ik7nqFQ |
||
|
Пользователь 153388 Заглянувший Сообщений: 3 |
#239 21.03.2023 17:10:48 Здравствуйте, прошу помочь с кодом. При переходе на php 8.2 вылезли ошибки implode и explode. С первой справился, со второй не могу понять. ошибка
сам код
|
||||
|
Станислав, https://www.php.net/manual/ru/function.explode.php php8: explode() теперь выбрасывает TypeError , если параметр separator является пустой строкой («»). Ранее вместо исключения explode() возвращала false. |
|
|
Пользователь 153388 Заглянувший Сообщений: 3 |
#241 21.03.2023 18:15:18
У меня separator ведь не пустая строка |
||
|
Пользователь 3918986 Посетитель Сообщений: 65 |
#242 21.03.2023 19:05:33
Ай, не то скопировал. Прошу прощения. |
||||
|
Пользователь 153388 Заглянувший Сообщений: 3 |
#243 21.03.2023 22:46:15 Евгений Уразов,
Благодарю за помощь. Я перевод ошибки понял, просто не понятно, что у меня параметры в MIME_TYPE передаются именно строки, странно что explode их на данном этапе не видит и действительно получает 0. Пришлось обойтись без этой функции
мне помогло, не знаю пригодится ли такой частный случай кому-то ещё |
||||
|
Скачал с сайта bitrixsetup.php начал установку сайта. /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 |
#246 24.03.2023 16:09:52
ну и ВАМ не скучно … у покупающих продукт одна цель покажите день в календаре когда у Битрикса не было *приколов* с ДОПИЛИТЕ САМИ — не маленькие |
||
|
Пользователь 77923 Посетитель Сообщений: 81 |
#247 27.03.2023 01:32:11 php 8 22.600.100 .
Ошибка возникает при оформлении заказа. Подскажите как исправить? |
||
|
Все всем спасибо ! ))) |
|
|
Пользователь 5172 Посетитель Сообщений: 45 |
#249 03.04.2023 17:42:31 Коллеги, добрый день! Может кто сталкивался с такой проблемой и решил, у меня не получается. Код много лет назад был взят из открытых источников и работал, но сейчас выдаёт ошибку.
Понимаю, что проблема в этой строке,
Решение, описанное здесь — https://www.brekot.ru/blog/argument-1-value-must-be-of-type-countable-array/ не помогло. Код используется для вывода загруженных на сайт документов. Первая часть для одного документа, вторая для 2 и более. Не идеал, но ничего лучше не нашла. Буду признательна, если поможете. |
||||
|
Пользователь 125253 Постоянный посетитель Сообщений: 441 |
#250 03.04.2023 18:19:59 Татьяна Виноградова,
или
Но наличие можно проверить без сравнения с 1.
|
||||||
В административном интерфейсе коробочных версий продуктов «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 необходимо произвести поэтапно. Для этого обратитесь к вашему системному администратору или в техподдержку вашего хостинга.
-
Обязательно создайте резервную копию вашей установки. Это может быть как резервная копия средствами продукта, так и полностью всего сервера, например виртуальной машины VMBitrix.
-
Обновите ядро и все модули продукта до последних доступных версий в разделе Настройки > Marketplace > Обновление платформы.
-
Обновите все сторонние решения из Маркетплейса до последних доступных версий в разделе Настройки > Marketplace > Обновление решений.
-
Обновите версию PHP до минимальной 8.0 или рекомендованной 8.1 на своем сервере.
Если вы используете виртуальную машину VMBitrix, то обновить PHP можно через меню VMBitrix: 1. Manage servers in the pool — 8. Update PHP and MySQL. Подробнее читайте в отдельном курсе.
- Еще раз проверьте и установите все доступные обновления платформы и решений из Маркетплейса.
Куда обращаться в случае ошибок при обновлении версии 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С-Битрикс, когда это станет критичным. Большинство правок являются простыми вариантами, связанными с ужесточением политики определения предупреждений и ошибок, что на текущем этапе исправляется достаточно быстро.
Другие кейсы

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

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

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

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

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

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

Как и зачем проверять скорость загрузки сайта и валидацию
Подробнее
После перевода нескольких десятков сайтов на 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.х
В интернет-проект на битриксе содержит несколько условно-выделяемых сущностей:
- Ядро проекта — это сам продукт Битрикс. за ошибки и несовместимости отвечает компания Битрикс. На момент написания статьи ядро битрикса стабилизировано в работе на версии php 8.x
- Сторонние модули, установление из маркетплейса. За эти модули отвечают их авторы, часть решений еще не переведено для совместимости работы на php8 на момент написания статьи
- И наконец, код конкретного проекта
Во всех этих инструментах заложен потенциальный риск перехода на версию 8.x, и если в ядре проекта он минимизирован самим продуктом Битрикс и его тех.поддержкой, то в сторонних модулях могут возникнуть проблемы (например, закончилась лицензия стороннего модуля и для получения обновлений этого модуля нужно продлить лицензию). А что касается конкретного кода отдельного проекта — за него отвечает специалист, технически ведущий данный проект. Таким специалистом нередко является владелец сайта, в этом случае при остуствии соотвествующей компетенции вы можете обратиться к нам.
Как обновить PHP
Обновление версии PHP необходимо произвести поэтапно.
Очень желательно провести эту операцию на тестовой площадке, т.к. можно заранее внести исправления в код, чтобы он работал и на версии php8 и на более низких версиях языка, а также понять, какие из модулей вызывают ошибки и требуют либо обновления, либо их удаления, либо исправления обок в коде. Однако такая предварительная «разведка» занимает больше времени, соответственно, и услуга по переходу на новую версию php8 будет стоить дороже.
Можно проводить обновления и на уже работающем проекте («в бою») без предварительной проверки, но какой бы способ не оказался оптимальным, в любом случае сперва нужно выполнить резервное копирование.
Для обновления нужно обратиться к вашему системному администратору или в техподдержку вашего хостинга, и скорее всего вам потребуется разработчик проекта для исправления ошибок в коде для нового окружения php8.
-
Обязательно создайте резервную копию вашей установки. Это может быть как резервная копия средствами продукта, так и полностью всего сервера, например виртуальной машины VMBitrix.
-
Обновите ядро и все модули продукта до последних доступных версий в разделе Настройки > Marketplace > Обновление платформы.
-
Обновите все сторонние решения из Маркетплейса до последних доступных версий в разделе Настройки > Marketplace > Обновление решений.
-
Обновите версию PHP до минимальной 8.0 или рекомендованной 8.1 на своем сервере.
Если вы используете виртуальную машину VMBitrix, то обновить PHP можно через меню VMBitrix: 1. Manage servers in the pool — 8. Update PHP and MySQL. Подробнее читайте в отдельном курсе.
- Еще раз проверьте и установите все доступные обновления платформы и решений из Маркетплейса.
Куда обращаться в случае ошибок при обновлении версии 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 для разработчиков
Назад в раздел
