Ошибка строковая функция strlen работает некорректно bitrix

  • goodprogrammist

После миграции на php74 возникает сабж в журнале проверки системы.
Как результат, перестал работать обмен с 1С.
Советы из контекстного хэлпа в журнале проверки к решению не привели.

5e52d020eb837121159596.png


  • Вопрос задан

  • 4416 просмотров

Сталкивался с такой проблемой.
Решение в лоб: прописать mbstring.func_overload 2 в файле php.ini глобально, а не в конфиге веб сервера или fpm.
Видимо это какой то баг php, который никто фиксить уже не будет

Пригласить эксперта


  • Показать ещё
    Загружается…

22 сент. 2023, в 21:27

300 руб./за проект

22 сент. 2023, в 19:59

5000 руб./за проект

22 сент. 2023, в 18:59

30000 руб./за проект

Минуточку внимания

После обновления версии PHP на сервере с 7.2 до 7.4 появилась ошибка

Параметры настройки UTF (mbstring и константа BX_UTF) (check_mbstring): Fail
Ошибка! Строковая функция strlen работает некорректно.

Настройки сервера были адаптированы под Bitrix, в конфигурационном файле виртуального хоста для apache было указано

php_admin_value mbstring.func_overload 2
    php_admin_value mbstring.internal_encoding UTF-8

Проверка через phpinfo() показывала, что всё включено, но битрикс продолжал выводить ошибку, что функция strlen работает некорректно.

В процессе поисков решения нашлась только информация о том, что ошибка известна, связана с объявлением глобальных переменных, но исправлять её не планируется.

Единственным работающим решением на момент написания заметки является принудительная установка значения mbstring.func_overload 2 в php.ini

Для Debian/Ubuntu файл находится в

/etc/php/7.4/apache2/php.ini

Необходимо раскоментировать строку (удалив символ;) и установить значение

mbstring.func_overload = 2

После этого ошибка исчезает.

Предупреждение: если кроме битрикса используете другие cms или фреймворки, из-за глобального параметра могут быть проблемы в их работе, т.к. рекомендуемое значение данного параметра 0 — т.е. не используется. Например проблемы могут возникать с некоторыми версиями phpmyadmin, шаблонизатором twig

Почему появляется ошибка?

Данная проблема связана с некорректной настройкой кодировки в PHP.

Обычно, для сайтов, работающих на UTF-8, следующие требования по настройке PHP:

  • mbstring.func_overload=2
  • mbstring.internal_encoding=UTF-8
  • default_charset=UTF-8

А для сайтов на windows-1251 требования следующие:

  • mbstring.func_overload=0
  • mbstring.internal_encoding=CP1251
  • default_charset=CP1251

Ошибка говорит о том, что настройки некорректны.

На что эта ошибка влияет?

Данная ошибка, как и в целом ошибки кодировки, являются важными и требуют обязательного решения.

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

Также проблемы кодировки могут быть причиной некорректной работы с компонентами в публичной части («Не удалось обнаружить код вызова компонента»).

Как исправить ошибку?

Прежде всего, следует указать правильные конфигурационные параметры PHP — в зависимости от используемой кодировки.

Однако, есть нюансы. Во-первых, для сайтов на кодировке windows-1251 может понадобиться донастройка локали на сервере:

localedef -c -i ru_RU -f CP1251 ru_RU.CP1251 (после этого необходимо перезапустить веб-сервер)

И также в этом случае необходимо прописать локаль в конфиг Битрикса (/bitrix/php_interface/dbconn.php):

setlocale(LC_ALL, ‘ru_RU.CP1251’);
setlocale(LC_NUMERIC, ‘C’);

Но и это еще не всё. На версиях хостингах, при работе на PHP версии 7.3 и выше, ошибка может показываться даже при корректно сделанных настройках — в таком случае рекомендуем использовать версию PHP 7.2.

Требуется наша помощь?

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

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

Почему появляется ошибка?

Данная проблема связана с некорректной настройкой кодировки в PHP.

Обычно, для сайтов, работающих на UTF-8, следующие требования по настройке PHP:

  • mbstring.func_overload=2
  • mbstring.internal_encoding=UTF-8
  • default_charset=UTF-8

А для сайтов на windows-1251 требования следующие:

  • mbstring.func_overload=0
  • mbstring.internal_encoding=CP1251
  • default_charset=CP1251

Ошибка говорит о том, что настройки некорректны.

На что эта ошибка влияет?

Данная ошибка, как и в целом ошибки кодировки, являются важными и требуют обязательного решения.

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

Также проблемы кодировки могут быть причиной некорректной работы с компонентами в публичной части («Не удалось обнаружить код вызова компонента»).

Как исправить ошибку?

Прежде всего, следует указать правильные конфигурационные параметры PHP — в зависимости от используемой кодировки.

Однако, есть нюансы. Во-первых, для сайтов на кодировке windows-1251 может понадобиться донастройка локали на сервере:

localedef -c -i ru_RU -f CP1251 ru_RU.CP1251 (после этого необходимо перезапустить веб-сервер)

И также в этом случае необходимо прописать локаль в конфиг Битрикса (/bitrix/php_interface/dbconn.php):

setlocale(LC_ALL, ‘ru_RU.CP1251’);
setlocale(LC_NUMERIC, ‘C’);

Но и это еще не всё. На версиях хостингах, при работе на PHP версии 7.3 и выше, ошибка может показываться даже при корректно сделанных настройках — в таком случае рекомендуем использовать версию PHP 7.2.

Требуется наша помощь?

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

Поэтому, если Вы не имеете возможности решить эту проблему самостоятельно, обращайтесь к нам — мы все сделаем оперативно и квалифицированно.

После обновления версии PHP на сервере с 7.2 до 7.4 появилась ошибка

Параметры настройки UTF (mbstring и константа BX_UTF) (check_mbstring): Fail
Ошибка! Строковая функция strlen работает некорректно.

Настройки сервера были адаптированы под Bitrix, в конфигурационном файле виртуального хоста для apache было указано

php_admin_value mbstring.func_overload 2
    php_admin_value mbstring.internal_encoding UTF-8

Проверка через phpinfo() показывала, что всё включено, но битрикс продолжал выводить ошибку, что функция strlen работает некорректно.

В процессе поисков решения нашлась только информация о том, что ошибка известна, связана с объявлением глобальных переменных, но исправлять её не планируется.

Единственным работающим решением на момент написания заметки является принудительная установка значения mbstring.func_overload 2 в php.ini

Для Debian/Ubuntu файл находится в

/etc/php/7.4/apache2/php.ini

Необходимо раскоментировать строку (удалив символ;) и установить значение

mbstring.func_overload = 2

После этого ошибка исчезает.

Предупреждение: если кроме битрикса используете другие cms или фреймворки, из-за глобального параметра могут быть проблемы в их работе, т.к. рекомендуемое значение данного параметра 0 — т.е. не используется. Например проблемы могут возникать с некоторыми версиями phpmyadmin, шаблонизатором twig

  • #1

Глюк в строковой функции strlen

PHP:

<?php 
$str = "привет";
echo "Привет без пробела = " . strlen($str) . " символа(ов)<br>"; // 6
$str = " Привет";  echo "Привет с пробелом = " . strlen($str) . "символа(ов)"; // 7 
?>

Сам файл в ANSI (в UTF все работает нормально).

Результат функции следующий:

Привет без пробела = 2 символа(ов)
Привет с пробелом = 4 символа(ов)

Один раз из 5-6 выдает нормальный результат. И-за чего возникает глюк?

PHP Version 5.2.6

  • #2

Такой код что выдаёт?

PHP:

$str = "xEFxF0xE8xE2xE5xF2"; 
echo "Привет без пробела = " . strlen($str) . " символа(ов)<br>"; // 6 
$str = "x20".$str;
echo "Привет с пробелом = " . strlen($str) . " символа(ов)"; // 7
  • #3

мб надо использовать mb_strlen ?

phprus

  • #5

Автор оригинала: phprus
mbstring.func_overload — имеет значение не равное 0, а echo mb_internal_encoding(); выводит utf-8?

Да.

Вот настройки mbstring

-~{}~ 03.11.09 14:29:

Спасибо всем, исправил на ISO-8859-1 и в ANSI все стало норм работать.

phprus

  • #6

Параноикъ
Я думаю, что более правильным было-бы отключить mbstring.func_overload, а в случае реальной необходимости работы с многобайтовыми кодировками непосредственно использовать mb_*-функции у которых параметром передавать нужную кодировку.

А то подсовывание ISO-8859-1 может потенциально провести к проблемам, связанным, например, с изменением регистра текста на русском языке, или на языке букв которого нету в кодировке ISO-8859-1.

  • #7

Отключил mbstring.func_overload.

Проблема остается тогда актуальной. Неделю назад обновлялся сервер. Какие библиотеки могли быть обновлены, после чего стали глючить строковые функции?

phprus

  • #8

Параноикъ

Отключил mbstring.func_overload.

Проблема остается тогда актуальной

Те после прописывания mbstring.func_overload = 0 в php.ini проблема не решилась?
А apache (если у тебя mod_php) перезапускал? Что после этого говорит phpinfo()?

  • #9

phprus
Те после прописывания mbstring.func_overload = 0 в php.ini проблема не решилась?
А apache (если у тебя mod_php) перезапускал? Что после этого говорит phpinfo()?

с mbstring.func_overload = 0 — глюки не ушли.
Апач естественно дергаю после каждого апдейта конфигов.

После удаления пакета php-mbstring-5.2.6-1.el5.remi, строковые функции стали корректно работать.
Вот теперь думаю откатывать все php библиотеки назад или разбираться с php-mbstring-5.2.6-1.el5.remi

Что посоветуете?

phprus

  • #10

с mbstring.func_overload = 0 — глюки не ушли.
Апач естественно дергаю после каждого апдейта конфигов.

А ты правишь тот конфиг, который у тебя реально используется? Посмотри в phpinfo(), какой конфиг на самом деле использует php и изменилось ли значение mbstring.func_overload в выводе phpinfo() после изменения конфига и перезапуска сервера?
А какие файлы предоставлял пакет php-mbstring-5.2.6-1.el5.remi?

  • #11

[[email protected] packages]# /usr/bin/php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

/etc/php.ini его и правлю
mbstring.func_overload в phpinfo — изменяется

php-mbstring-5.2.6-1.el5.remi предоставляет файл конфиг и сам модуль.

—-

Обновил php до версии 5.2.11, теперь все работает отлично. Надеюсь больше глюков не будет. Спасибо за помощь.


09
мая
2017

Информация о материале

Автор: Долматов Вячеслав

Просмотров: 7200

Программисты работающие на языке php наверняка сталкивались с проблемой не корректной работы функции strlen предназначенной для подсчёта количества символов в строке. Иногда она даёт точное количество символов в строке, а иногда ошибается. Проблема здесь заключается в том, что функция strlen не всегда корректно обрабатывает кириллические символы, в то время как раскладку английского языка она всегда отрабатывает абсолютно точно.

Для того что бы разобраться, что на самом деле происходит, давайте рассмотрим работу функции strlen на очень простом примере:

Присвоим переменной $str два значения в первом случае это будет строка привет на русском языке, а во втором случае это будет строка privet на английском языке.

<?php
$str
= ‘привет’;
echo
strlen($str); // Ответ должен быть: 6

echo‘<br>’;

$str = ‘privet’;
echo
strlen($str); // Ответ должен быть: 6
?>

На первый взгляд, совершенно очевидно, что как в первом, так и во втором случае при отработке данного кода, мы увидим на экране ответ, что в обеих строках число символов равно 6-ти. Но на самом деле — это не так! После обработки функцией strlen(); строки на русском языке, мы увидим число 12-ть (хотя там может быть и иное число), а вот после обработки функцией strlen(); строки на английском языке, мы действительно увидим число 6-ть.

Что бы избавиться от подобной неопределённости, следует использовать функцию mb_strlen(); которая так же вычисляет длину строки, но использует два параметра. Первый параметр – это переменная содержащая строку, длину которой следует определить, а второй – это кодировка той самой строки.

Давайте рассмотрим приведённый выше пример, но на этот раз в качестве функции, вычисляющей длину строки будем использовать mb_strlen(); :

<?php
$str
= ‘привет’;
echo
mb_strlen($str, ‘utf-8’); // Ответ должен быть: 6

echo‘<br>’;

$str = ‘privet’;
echo
mb_strlen($str, ‘utf-8’); // Ответ должен быть: 6
?>

В данном случае, мы так же определяем количество символов в обеих строках, но помимо переменной $str в качестве параметра передаём ещё и кодировку utf-8. Теперь при вычислении количества символов обеих строк мы получим число 6-ть. Что соответствует действительности. Так что при определении количества символов в строке, написанной на кириллице следует использовать функцию mb_strlen(), а не strlen().

P.S. При передаче дополнительного параметра utf-8, функция mb_strlen(); всегда правильно вычисляет количество символов в строке написанной как на русском, так и на английском языках. Будет ли это работать на другом языке (например, китайском) я не знаю. Потому как опыта использования данного метода на иных языках у меня нет.

  • goodprogrammist

После миграции на php74 возникает сабж в журнале проверки системы.
Как результат, перестал работать обмен с 1С.
Советы из контекстного хэлпа в журнале проверки к решению не привели.

5e52d020eb837121159596.png


  • Вопрос задан

    более двух лет назад

  • 4174 просмотра

Сталкивался с такой проблемой.
Решение в лоб: прописать mbstring.func_overload 2 в файле php.ini глобально, а не в конфиге веб сервера или fpm.
Видимо это какой то баг php, который никто фиксить уже не будет

Пригласить эксперта


  • Показать ещё
    Загружается…

09 февр. 2023, в 10:11

1500 руб./в час

09 февр. 2023, в 09:53

10 руб./за проект

09 февр. 2023, в 09:28

5000 руб./за проект

Минуточку внимания

Почему появляется ошибка?

Данная проблема связана с некорректной настройкой кодировки в PHP.

Обычно, для сайтов, работающих на UTF-8, следующие требования по настройке PHP:

  • mbstring.func_overload=2
  • mbstring.internal_encoding=UTF-8
  • default_charset=UTF-8

А для сайтов на windows-1251 требования следующие:

  • mbstring.func_overload=0
  • mbstring.internal_encoding=CP1251
  • default_charset=CP1251

Ошибка говорит о том, что настройки некорректны.

На что эта ошибка влияет?

Данная ошибка, как и в целом ошибки кодировки, являются важными и требуют обязательного решения.

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

Также проблемы кодировки могут быть причиной некорректной работы с компонентами в публичной части («Не удалось обнаружить код вызова компонента»).

Как исправить ошибку?

Прежде всего, следует указать правильные конфигурационные параметры PHP — в зависимости от используемой кодировки.

Однако, есть нюансы. Во-первых, для сайтов на кодировке windows-1251 может понадобиться донастройка локали на сервере:

localedef -c -i ru_RU -f CP1251 ru_RU.CP1251 (после этого необходимо перезапустить веб-сервер)

И также в этом случае необходимо прописать локаль в конфиг Битрикса (/bitrix/php_interface/dbconn.php):

setlocale(LC_ALL, ‘ru_RU.CP1251’);
setlocale(LC_NUMERIC, ‘C’);

Но и это еще не всё. На версиях хостингах, при работе на PHP версии 7.3 и выше, ошибка может показываться даже при корректно сделанных настройках — в таком случае рекомендуем использовать версию PHP 7.2.

Требуется наша помощь?

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

Поэтому, если Вы не имеете возможности решить эту проблему самостоятельно, обращайтесь к нам — мы все сделаем оперативно и квалифицированно.

После обновления версии PHP на сервере с 7.2 до 7.4 появилась ошибка

Параметры настройки UTF (mbstring и константа BX_UTF) (check_mbstring): Fail
Ошибка! Строковая функция strlen работает некорректно.

Настройки сервера были адаптированы под Bitrix, в конфигурационном файле виртуального хоста для apache было указано

php_admin_value mbstring.func_overload 2
    php_admin_value mbstring.internal_encoding UTF-8

Проверка через phpinfo() показывала, что всё включено, но битрикс продолжал выводить ошибку, что функция strlen работает некорректно.

В процессе поисков решения нашлась только информация о том, что ошибка известна, связана с объявлением глобальных переменных, но исправлять её не планируется.

Единственным работающим решением на момент написания заметки является принудительная установка значения mbstring.func_overload 2 в php.ini

Для Debian/Ubuntu файл находится в

/etc/php/7.4/apache2/php.ini

Необходимо раскоментировать строку (удалив символ;) и установить значение

mbstring.func_overload = 2

После этого ошибка исчезает.

Предупреждение: если кроме битрикса используете другие cms или фреймворки, из-за глобального параметра могут быть проблемы в их работе, т.к. рекомендуемое значение данного параметра 0 — т.е. не используется. Например проблемы могут возникать с некоторыми версиями phpmyadmin, шаблонизатором twig

Мне на сервере обновили php до 7.4.9 и попросили обновить битрикс до самого свежего, всё выполнилось нормально за исключением одного вот этого момента. При проверке системы в поле `Параметры настройки UTF (mbstring и константа BX_UTF)` вылезает ошибка `Ошибка! Строковая функция strlen работает некорректно.` в файле php.ini задал
полю mbstring.func_overload значение 2, в .htaccess тоже написал эту строку. В dbconn пробовал писать `setlocale(LC_ALL, ‘ru_RU.CP1251′); setlocale(LC_NUMERIC,’C’);` не помогло. В init.php добавил строку `mb_internal_encoding(‘utf-8’);` тоже не помогло. Вообще сервер выдаёт такую инфу об mbstring5f438a7c45283745105448.png
Не представляю уже, как решить эту задачу, очень прошу помочь, потому что остальные задачи стоят, а корпею я над этим вопросом уже дня 2


  • Вопрос задан

    более года назад

  • 350 просмотров

  • #1

Глюк в строковой функции strlen

PHP:

<?php 
$str = "привет";
echo "Привет без пробела = " . strlen($str) . " символа(ов)<br>"; // 6
$str = " Привет";  echo "Привет с пробелом = " . strlen($str) . "символа(ов)"; // 7 
?>

Сам файл в ANSI (в UTF все работает нормально).

Результат функции следующий:

Привет без пробела = 2 символа(ов)
Привет с пробелом = 4 символа(ов)

Один раз из 5-6 выдает нормальный результат. И-за чего возникает глюк?

PHP Version 5.2.6

  • #2

Такой код что выдаёт?

PHP:

$str = "xEFxF0xE8xE2xE5xF2"; 
echo "Привет без пробела = " . strlen($str) . " символа(ов)<br>"; // 6 
$str = "x20".$str;
echo "Привет с пробелом = " . strlen($str) . " символа(ов)"; // 7
  • #3

мб надо использовать mb_strlen ?

phprus

  • #5

Автор оригинала: phprus
mbstring.func_overload — имеет значение не равное 0, а echo mb_internal_encoding(); выводит utf-8?

Да.

Вот настройки mbstring

-~{}~ 03.11.09 14:29:

Спасибо всем, исправил на ISO-8859-1 и в ANSI все стало норм работать.

phprus

  • #6

Параноикъ
Я думаю, что более правильным было-бы отключить mbstring.func_overload, а в случае реальной необходимости работы с многобайтовыми кодировками непосредственно использовать mb_*-функции у которых параметром передавать нужную кодировку.

А то подсовывание ISO-8859-1 может потенциально провести к проблемам, связанным, например, с изменением регистра текста на русском языке, или на языке букв которого нету в кодировке ISO-8859-1.

  • #7

Отключил mbstring.func_overload.

Проблема остается тогда актуальной. Неделю назад обновлялся сервер. Какие библиотеки могли быть обновлены, после чего стали глючить строковые функции?

phprus

  • #8

Параноикъ

Отключил mbstring.func_overload.

Проблема остается тогда актуальной

Те после прописывания mbstring.func_overload = 0 в php.ini проблема не решилась?
А apache (если у тебя mod_php) перезапускал? Что после этого говорит phpinfo()?

  • #9

phprus
Те после прописывания mbstring.func_overload = 0 в php.ini проблема не решилась?
А apache (если у тебя mod_php) перезапускал? Что после этого говорит phpinfo()?

с mbstring.func_overload = 0 — глюки не ушли.
Апач естественно дергаю после каждого апдейта конфигов.

После удаления пакета php-mbstring-5.2.6-1.el5.remi, строковые функции стали корректно работать.
Вот теперь думаю откатывать все php библиотеки назад или разбираться с php-mbstring-5.2.6-1.el5.remi

Что посоветуете?

phprus

  • #10

с mbstring.func_overload = 0 — глюки не ушли.
Апач естественно дергаю после каждого апдейта конфигов.

А ты правишь тот конфиг, который у тебя реально используется? Посмотри в phpinfo(), какой конфиг на самом деле использует php и изменилось ли значение mbstring.func_overload в выводе phpinfo() после изменения конфига и перезапуска сервера?
А какие файлы предоставлял пакет php-mbstring-5.2.6-1.el5.remi?

  • #11

[[email protected] packages]# /usr/bin/php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

/etc/php.ini его и правлю
mbstring.func_overload в phpinfo — изменяется

php-mbstring-5.2.6-1.el5.remi предоставляет файл конфиг и сам модуль.

—-

Обновил php до версии 5.2.11, теперь все работает отлично. Надеюсь больше глюков не будет. Спасибо за помощь.

Понравилась статья? Поделить с друзьями:
  • Ошибка субару b0201
  • Ошибка стояночного тормоза volkswagen пассат сс
  • Ошибка строка не распознана как действительное значение datetime
  • Ошибка соединения 0x4803 kyocera smtp
  • Ошибка стояночного тормоза w221