После миграции на 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, теперь все работает отлично. Надеюсь больше глюков не будет. Спасибо за помощь.