Здравствуйте, восстановил из бэкапа сайт, в поле «Параметры настройки UTF (mbstring и константа BX_UTF)» вылезра ошибка — ‘Ошибка! Строковые функции работают некорректно.Такая ситуация может возникать из-за ошибки в PHP 5.6 (
https://bugs.php.net/bug.php?id=68644
), в этом случае надо установить более раннюю или более позднюю версию PHP.’ пробовал всякие варианты, то всё падает, то не помогает.. прошу помочь разобраться с этим. Ошибка, которую выводит php на самом сайте выглядит так ‘Call to undefined function mb_orig_strtolower()’
После миграции на php74 возникает сабж в журнале проверки системы.
Как результат, перестал работать обмен с 1С.
Советы из контекстного хэлпа в журнале проверки к решению не привели.
-
Вопрос заданболее трёх лет назад
-
4340 просмотров
Сталкивался с такой проблемой.
Решение в лоб: прописать mbstring.func_overload 2 в файле php.ini глобально, а не в конфиге веб сервера или fpm.
Видимо это какой то баг php, который никто фиксить уже не будет
Пригласить эксперта
-
Показать ещё
Загружается…
22 июн. 2023, в 13:40
2500 руб./за проект
22 июн. 2023, в 13:18
30000 руб./за проект
22 июн. 2023, в 13:13
200000 руб./за проект
Минуточку внимания
Перейти к контенту
Почему появляется ошибка?
Данная проблема связана с некорректной настройкой кодировки в 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 ?
-
#5
Автор оригинала: phprus
mbstring.func_overload — имеет значение не равное 0, а echo mb_internal_encoding(); выводит utf-8?
Да.
Вот настройки mbstring
-~{}~ 03.11.09 14:29:
Спасибо всем, исправил на ISO-8859-1 и в ANSI все стало норм работать.
-
#6
Параноикъ
Я думаю, что более правильным было-бы отключить mbstring.func_overload, а в случае реальной необходимости работы с многобайтовыми кодировками непосредственно использовать mb_*-функции у которых параметром передавать нужную кодировку.
А то подсовывание ISO-8859-1 может потенциально провести к проблемам, связанным, например, с изменением регистра текста на русском языке, или на языке букв которого нету в кодировке ISO-8859-1.
-
#7
Отключил mbstring.func_overload.
Проблема остается тогда актуальной. Неделю назад обновлялся сервер. Какие библиотеки могли быть обновлены, после чего стали глючить строковые функции?
-
#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
Что посоветуете?
-
#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(); всегда правильно вычисляет количество символов в строке написанной как на русском, так и на английском языках. Будет ли это работать на другом языке (например, китайском) я не знаю. Потому как опыта использования данного метода на иных языках у меня нет.
После миграции на php74 возникает сабж в журнале проверки системы.
Как результат, перестал работать обмен с 1С.
Советы из контекстного хэлпа в журнале проверки к решению не привели.
-
Вопрос заданболее двух лет назад
-
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’);` тоже не помогло. Вообще сервер выдаёт такую инфу об mbstring
Не представляю уже, как решить эту задачу, очень прошу помочь, потому что остальные задачи стоят, а корпею я над этим вопросом уже дня 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 ?
-
#5
Автор оригинала: phprus
mbstring.func_overload — имеет значение не равное 0, а echo mb_internal_encoding(); выводит utf-8?
Да.
Вот настройки mbstring
-~{}~ 03.11.09 14:29:
Спасибо всем, исправил на ISO-8859-1 и в ANSI все стало норм работать.
-
#6
Параноикъ
Я думаю, что более правильным было-бы отключить mbstring.func_overload, а в случае реальной необходимости работы с многобайтовыми кодировками непосредственно использовать mb_*-функции у которых параметром передавать нужную кодировку.
А то подсовывание ISO-8859-1 может потенциально провести к проблемам, связанным, например, с изменением регистра текста на русском языке, или на языке букв которого нету в кодировке ISO-8859-1.
-
#7
Отключил mbstring.func_overload.
Проблема остается тогда актуальной. Неделю назад обновлялся сервер. Какие библиотеки могли быть обновлены, после чего стали глючить строковые функции?
-
#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
Что посоветуете?
-
#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, теперь все работает отлично. Надеюсь больше глюков не будет. Спасибо за помощь.
Почему появляется ошибка?
Данная проблема связана с некорректной настройкой кодировки в 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 лет помогая клиентам в решении самых различных проблем на их сайтах, в т.ч. самых сложных.
Поэтому, если Вы не имеете возможности решить эту проблему самостоятельно, обращайтесь к нам — мы поможем.