Устранение предупреждения в 1С:Битрикс - "Замечание. Возможны проблемы в работе с длинными строками из-за системных ограничений".
Устранение предупреждения БУС, размер стека и pcre.recursion_limit
Довольно часто в результатах штатной проверки системы можно увидеть такое предупреждение:
К сожалению текст ошибки мало информативен, для web разработчика:
Параметр pcre.recursion_limit по умолчанию имеет значение 100000. Если он превышает системный размер стека (обычно 8 Мб), то PHP падает с ошибкой Segmentation fault при выполнении сложных регулярных выражений.
Снять ограничение на размер стека на Linux можно в скрипте запуска Apache вызовом:
ulimit -s unlimited
На FreeBSD необходимо пере собрать порт pcre с опцией --disable-stack-for-recursion
Если это не возможно и на Windows надо уменьшить параметр pcre.recursion_limit до 1000 или ниже.
В этом случае PHP падать не будет, но обработка строк будет работать не всегда правильно: например, могут появляться пустые сообщения на форуме.
Для устранения, необходимо выполнить следующие действия.
Первое, что нужно сделать - это найти файл "/etc/php.d/bitrixenv.ini" - он содержит основные настройки php для веб окружения и заменить в нем "pcre.recursion_limit = 14000" на "pcre.recursion_limit = 100000".
Вводим в консоли:
nano /etc/php.d/bitrixenv.ini
В секции "Change default values of important constants":
Так же потребуется модифицировать скрипт запуска сервера HTTP Apache "/etc/rc.d/init.d/httpd". В файле необходимо модифицировать функцию запуска веб-сервера "start()", добавив в нее еще одну строку (ulimit -s unlimited).
После проделанных действий необходимо перезапустить web сервер:
service httpd restart
Если все сделано верно, можно повторно запустить штатную проверку системы и увидеть результат:
Размер стека и pcre.recursion_limit в CentOS 7
В CentOS 7 больше не используется init.d и выше описанные действия справедливы только для CentOS 6 и ниже.
Для CentOS 7, последовательность действий практически такая же, за исключением, правки файла "/etc/rc.d/init.d/httpd", теперь потребуется создать новую директорию:
mkdir /etc/systemd/system/httpd.service.d
После успешного создания директории, в ней потребуется создать файл с произвольным именем, но с обязательны окончанием .conf:
cd /etc/systemd/system/httpd.service.d
touch pcre.conf
nano /etc/systemd/system/httpd.service.d/pcre.conf
После успешного создания файла, в него потребуется добавить две строки:
[Service]
LimitSTACK=infinity
После успешного добавления строк и файла, потребуется перезагрузить "демонов" для этого необходимо выполнить команды:
systemctl daemon-reload
systemctl restart httpd
Так же не забывайте, что конфигурация php для Вашего хоста, должна быть как в выше описанном bitrixenv.ini, в некоторых ОС вместо LimitSTACK=infinity необходимо прописывать LimitSTACK=unlim