Содержание
Задача. Сайт на 1C Bitrix. В разделе Рабочий стол — Marketplace — Обновление платформы такое сообщение:
«Ошибка
Для обновления продукта необходимо удалить настройку PHP mbstring.func_overload. Пожалуйста, внесите необходимые изменения или обратитесь в службу технической поддержки вашего хостинга.
С 01.02.2023 будет ограничена поддержка наших продуктов на PHP версии ниже 8.0. Рекомендуемая версия PHP — 8.1 и выше. Вы используете версию PHP 7.4.33. Пожалуйста, запланируйте обновление PHP или обратитесь в службу технической поддержки вашего хостинга.»
Что такое mbstring.func_overload? В старых версиях PHP и 1С-Битрикс (когда многие сайты еще работали на однобайтовой кодировке windows-1251), эта настройка была своеобразным «костылем». Директива mbstring.func_overload = 2 заставляла PHP автоматически перехватывать стандартные строковые функции (например, strlen или substr) и заменять их на их мультибайтовые аналоги (mb_strlen, mb_substr). Это позволяло корректно работать с кириллицей без переписывания всего кода платформы.
Эта функция была признана устаревшей (deprecated) еще в PHP 7.2 и полностью удалена в PHP 8.0. Современный ядро Битрикса (D7) полностью переведено на UTF-8. Разработчики платформы теперь явно используют mb_* функции там, где это необходимо. Включенный func_overload теперь вызывает баги, двойную перекодировку и непредсказуемое поведение системы.
Решение. Ваша конечная цель — перевести проект на PHP 8.3 или выше. Но чтобы это сделать, сайт должен быть подготовлен.
Если ваш сайт работает на кодировке windows-1251, отключение func_overload приведет к тому, что сайт сломается (вместо текста появятся «кракозябры»). Сначала сайт нужно перевести в UTF-8 (в Битриксе есть встроенный мастер конвертации).
Как проверить сайт всё ещё работает на кодировке windows-1251 или UTF-8?
- Проверка конфигурационных файлов (Ядро): Файл
/bitrix/php_interface/dbconn.php— ищите константу BX_UTF, еслиdefine("BX_UTF", true)— то UTF-8, если нет илиfalse, то windows-1251. Файл новых настроек ядра D7/bitrix/.settings.php, найдите массивutf_mode: Если'value' => true— UTF-8; , если'value' => false— windows-1251. - Проверка базы данных (SQL): Настройки -> Инструменты -> SQL запрос. Выполнить
SHOW VARIABLES LIKE 'character_set_database'; SHOW VARIABLES LIKE 'collation_database';. Если значения utf8 или utf8mb4 (например, utf8_general_ci или utf8_unicode_ci) — база в UTF-8. Если значения cp1251 (например, cp1251_general_ci) — база в windows-1251. - Проверка публичной части (Frontend). На сайте в панели разработчика браузера (F12) найти внутри тега
head, найдите мета-тегcharset
Сценарий А (Везде UTF-8): Сайт уже полностью в кодировке UTF-8. Можете смело идти в панель хостинга, отключать mbstring.func_overload (установить в 0 или снять галочку, если такая настройка там есть), обновлять Битрикс и затем повышать версию PHP до 8.1+.
Сценарий Б (Везде windows-1251): Трогать настройки PHP и обновлять ядро пока нельзя. При отключении func_overload сайт сломается. Сначала потребуется процедура конвертации всего сайта в UTF-8.
Обновление и перевод сайта на php необходимой версии
Шаг 1: Создание Backup-а. Не меняйте версию PHP или конфигурацию сервера без полного бэкапа файлов и базы данных.
Шаг 2: Отключение func_overload (Варианты реализации). Нужно установить значение этой директивы в 0. То, как именно это сделать, зависит от архитектуры вашего сервера.
Вариант А: Через панель управления хостингом (ISPmanager, cPanel, Beget и т.д.)
Это самый частый и безопасный путь для shared-хостингов:
- Зайдите в раздел «PHP» или «Настройки PHP».
- Найдите директиву mbstring.func_overload и снимите галочку или установите значение 0.
- Сохраните и перезагрузите веб-сервер (если панель это позволяет).
Вариант Б: Редактирование php.ini (Если у вас VPS/VDS)
Найдите ваш загруженный файл php.ini (путь можно посмотреть в административной панели Битрикса: Настройки -> Инструменты -> Настройки PHP) и внесите изменения:
|
1 2 3 4 5 6 7 |
; Отключаем перегрузку функций mbstring.func_overload = 0 ; Убеждаемся, что внутренняя кодировка выставлена верно mbstring.internal_encoding = "UTF-8" |
После изменения не забудьте перезапустить сервис.
Вариант В: Через .htaccess (Если сервер работает на Apache как модуле)
Если у вас нет доступа к php.ini, попробуйте добавить в корневой .htaccess:
|
1 2 3 4 5 |
<IfModule mod_php7.c> php_value mbstring.func_overload 0 </IfModule> |
Шаг 3: Обновление платформы 1С-Битрикс. После того как отключили настройку, предупреждение в разделе «Обновление платформы» должно исчезнуть.
- Обновите ядро и все модули продукта до последних доступных версий в разделе Настройки > Marketplace > Обновление платформы.
- Обновите все сторонние решения из Маркетплейса до последних доступных версий в разделе Настройки > Marketplace > Обновление решений (они тоже должны быть адаптированы под PHP 8).
Шаг 4: Переход на PHP 8.3+. Только когда ядро Битрикса и все модули обновлены до последних версий, идем в панель управления сервером/хостингом и переключаем версию PHP для сайта на 8.3 и выше (если модули позволяют).