Обычно для настройки сервера использую Битрикс Окружение, которое автоматически задаёт все необходимые параметры. К сожалению, окружение не работает на Ceontos 7. Поэтому приходится делать настройку в «ручном режиме». И одной из проблем становится выставление значения pcre.recursion_limit.
Встроенный в Битрикс синтетический тест настройки сервера выдаёт ошибку pcre.recursion_limit на Centos 7:
Параметр 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 падать не будет, но обработка строк будет работать не всегда правильно: например, могут появляться пустые сообщения на форуме.
Решение
Как сказано в заметке Битрикса, попробуем снять ограничение на размер стека. Чтоб узнать текущее значение размера (в килобайтах) выполним команду:
ulimit -s
По умолчанию ответ будет 8192 (8 мегабайт). Для снятия ограничения делаем папку для дополнительных конфигураций сервиса httpd:
mkdir /etc/systemd/system/httpd.service.d
В папке создаём файл lstack.conf с содержимым:
[Service]
LimitSTACK=infinity
Перезапускаем сервис и демона:
systemctl daemon-reload
systemctl restart httpd
Снятие этого ограничения может привести к недостатку оперативной памяти. Поэтому лучше ставить не infinity, а точное значение размера стека в байтах. К примеру, поставим 10 мегабайт = 10*1024*1024 = 10485760. Так и напишем:
LimitSTACK=10485760
В большинстве случаем такого размера хватает при
pcre.recursion_limit = 100 000