Устранение предупреждения в 1С:Битрикс - "Замечание. Возможны проблемы в работе с длинными строками из-за системных ограничений".

Устранение предупреждения БУС, размер стека и pcre.recursion_limit

Довольно часто в результатах штатной проверки системы можно увидеть такое предупреждение:
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":
; Change default values of important constants
max_input_vars = 10000
max_file_uploads = 100
max_execution_time = 300
post_max_size = 1024M
upload_max_filesize = 1024M
pcre.backtrack_limit = 1000000
pcre.recursion_limit = 14000
realpath_cache_size = 4096k
mysql.default_socket = /var/lib/mysqld/mysqld.sock
mysqli.default_socket = /var/lib/mysqld/mysqld.sock
Проведем замену "pcre.recursion_limit = 14000" на "pcre.recursion_limit = 100000":
; Change default values of important constants
max_input_vars = 10000
max_file_uploads = 100
max_execution_time = 300
post_max_size = 1024M
upload_max_filesize = 1024M
pcre.backtrack_limit = 1000000
;pcre.recursion_limit = 14000
pcre.recursion_limit = 100000
realpath_cache_size = 4096k
mysql.default_socket = /var/lib/mysqld/mysqld.sock
mysqli.default_socket = /var/lib/mysqld/mysqld.sock
Так же потребуется модифицировать скрипт запуска сервера HTTP Apache "/etc/rc.d/init.d/httpd". В файле необходимо модифицировать функцию запуска веб-сервера "start()", добавив в нее еще одну строку (ulimit -s unlimited).
Вводим в консоли:
nano /etc/rc.d/init.d/httpd
start() {
echo -n $"Starting $prog: "
ulimit -s unlimited
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
После проделанных действий необходимо перезапустить web сервер:
service httpd restart
Если все сделано верно, можно повторно запустить штатную проверку системы и увидеть результат:
pcre.recursion_limit предупреждение в битрикс отсутствует

Размер стека и 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