PCRE - работа с динамической памятью

Версия для печатиОтправить другуPDF version

При диагностике работы web-сервера, обнаружил ошибки, которые сыпались в лог httpd-error.log:

[Sun Feb 02 10:13:51.778392 2014] [core:notice] [pid 73431] AH00052: child pid 82474 exit signal Illegal instruction (4)
[Sun Feb 02 10:20:07.346392 2014] [core:notice] [pid 73431] AH00052: child pid 93379 exit signal Illegal instruction (4)
[Sun Feb 02 10:30:58.217398 2014] [core:notice] [pid 73431] AH00052: child pid 93375 exit signal Illegal instruction (4)
[Sun Feb 02 10:32:36.356384 2014] [core:notice] [pid 73431] AH00052: child pid 20375 exit signal Illegal instruction (4)

Версии установленного ПО:

# uname -opr
FreeBSD 9.1-RELEASE-p3 amd64
httpd -v
Server version: Apache/2.4.6 (FreeBSD)
Server built:   Dec 31 2013 12:57:30

php -v
PHP 5.3.28 with Suhosin-Patch (cli) (built: Dec 31 2013 13:02:04)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies

После длительного копания что и как, обнаружил, что ошибку вызывает библиотека pcre, которая вместо динамической памяти использовала стек, что при определенных условиях вызывало его переполнение, и, соответственно, родительский процесс "падал". Узнать, что pcre работает с использованием стека можно следующим образом:

# pcretest -C | grep 'Match recursion'
  Match recursion uses stack 

Решение - пересобрать pcre (/usr/ports/devel/pcre), и отключить опцию STACK_RECURSION.

После пересборки порта, проверяем, как работает pcre:

pcretest -C | grep 'Match recursion'
  Match recursion uses heap

Теперь можно смело увеличивать значение переменных php.ini, которые касаются pcre, не боясь преполнения стека. Для этого необходимо расскоментировать следующие опции в php.ini:

pcre.backtrack_limit = 100000
pcre.recursion_limit = 100000

Чтобы изменения вступили в силу, необходимо перезапустить веб-сервер:

sh /usr/local/etc/rc.d/apache24 restart

После этого Apache перестал "крашиться" и более проблем не замечалось.

Ваша оценка: Нет Средняя: 5 (2 голоса)

Вставай, Україно!

Литература

Страница показывалась KOI-как...