Обновление до PHP 8 и 1С-Битрикс, проблемы и ошибки
В феврале 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С-Битрикс? Обращайтесь!
Ошибки в «коробке» 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С-Битрикс, когда это станет критичным. Большинство правок являются простыми вариантами, связанными с ужесточением политики определения предупреждений и ошибок, что на текущем этапе исправляется достаточно быстро.