Предлагаю принять участие в тестировании новых фич в php-fpm.
Для каждого пула воркеров теперь доступны новые директивы:
request_terminate_timeout - таймаут (в секундах) для исполнения php запроса,
после которого воркер будет принудительно перезапущен. Это то, что раньше
называлось request_execution_timeout и не работало.
request_slowlog_timeout - таймаут (в секундах) для исполнения php запроса,
после которого в отдельный лог сохранится php backtrace того места в скрипте,
на котором, возможно, подвис запрос.
slowlog - имя файла для этого лога.
Мне не очень нравятся названия этих директив, но пока ничего лучше не
придумал. Принимаются предложения.
Качать отсюда - http://php-fpm.anight.org/downloads/test/
--
Andrei Nigmatulin
GPG PUB KEY 6449830D
Now I lay me down to sleep(3)
Pray the OS my core to keep
If I die before I wake
Pray the Disk my core to take
Некоторые пояснения.
Эти два таймаута могут быть использованы вместе и по-отдельности. Не имеет
смысла только выставление request_slowlog_timeout >=
request_terminate_timeout.
После того как php backtrace сохранен в лог, запрос продолжает выполняться,
как будто ничего не случилось.
Как только сработал request_terminate_timeout - fastcgi соединение обрывается
и nginx выдает клиенту 502, которую можно перехватить и нарисовать красоту.
request_terminate_timeout задумывался как крайняя мера против подвисших
скриптов, если не сработал max_execution_time. Поэтому, есть смысл выставлять
его значение в max_execution_time + 1.
slowlog задумывался как инструмент в помощь администратору, чтобы можно было
предъявить обоснованные претензии программистам неторопливых скриптов.
нормальные названия
только
slowlog я бы заменил на slowlog_filename
После того, как будет готов новый test-based парсер конфига.
Тогда по логике error_log надо тоже переименовать в error_log_filename ?
Работы над парсером конфига я продолжу после 1-го июня. Через пару дней (на пхп Конф) я встречусь с Андреем и обсужу некоторые детали.
Александр
PS. Вообще-то моя фирма закрылась и я временно без работы, положение не стабильное, по этому возможны еще какие-то проволочки, пока не трудоустроюсь.
http://www.hyperrealm.com/libconfig/
Такой парсер не подойдёт?
--
Wbr,
Antony Dovgal
Нет, он LGPL, а это не совместимо с лицензией php ;-)
И я забыл совсем: а в чем проблема с встроенным PHP-шным ini-парсером?
Чем он не подходит?
--
Wbr,
Antony Dovgal
Вариант такой:
[pool_1]
setting1 = 0
setting2 = /path/to/dev/null
[pool2]
setting1 = 123
setting2 = /point/to/nowhere
А вложенные структуры и массивы как оформлять ? Взгляни плиз на пример конфига
который идет в дистрибутиве, там есть вполне конкретная, нелинейная
структура.
"If I would look for another format for php-fpm configuration file I
would rather choose some nice c-style syntax, like nginx.conf does
have."
Just an idea,
If you are looking of examples of software with BSD license which already provide
possibility to parse configuration files with C style format then you might take a look
at nginx source (src/core/ngx_conf_file.c) or ISC BIND (lib/isccfg/parser.c).
Best regards,
--
Alexander Zhuravlev
Yes, I had looked at the sources of nginx and found many useful ideas for
myself. However, I'm pretty sure that writing such a parser is not a rocket
science. So I decided not to take a code, but only ideas for realisation.
For now, we (me and Alexandre Kalendarev) considered use of re2c for this
purpose. It is simple and flexible parser generator that can produce
embeddable code for almost any kind of config syntax and structure.
ну как хотите.
тока подчерки ставьте везде одинаково
слушайте
если вы ещё на такой стадии что не определились с парсером
может используете вот такой типа-SAX
http://sf.net/projects/urt
быстр, мал, тривиален, лицензия BSD
SunOS crisp.localnet.antora 5.10 Generic_118844-26 i86pc i386 i86pc
всё хорошо.
в логах красота.
nginx возвращает ошибка 502
настройки:
<value name="request_terminate_timeout">20s</value>
<value name="request_slowlog_timeout">3s</value>
<value name="slowlog">/var/log/php-slow.log</value>
скрипт:
<?
function i_am_idiot($i=0) {
echo $i."\n";
sleep(1);
i_am_idiot($i+1);
}
i_am_idiot();
?>
php-fpm.log:
May 29 11:44:19.531537 [WARNING] fpm_request_check_timed_out(), line
135: child 28942, script '/b/squirrel/tttit.php' (pool default)
executing too slow (3.044807 sec), logging
May 29 11:44:19.531777 [NOTICE] fpm_got_signal(), line 48: received SIGCHLD
May 29 11:44:19.531810 [NOTICE] fpm_children_bury(), line 188: child
28942 stopped for tracing
May 29 11:44:19.531831 [NOTICE] fpm_php_trace(), line 331: about to
trace 28942
May 29 11:44:19.533824 [NOTICE] fpm_php_trace(), line 359: finished
trace of 28942
May 29 11:44:19.533927 [NOTICE] fpm_got_signal(), line 48: received SIGCHLD
May 29 11:44:36.520998 [WARNING] fpm_request_check_timed_out(), line
147: child 28942, script '/b/squirrel/tttit.php' (pool default)
execution timed out (20.034778 sec), terminating
May 29 11:44:36.525719 [NOTICE] fpm_got_signal(), line 48: received SIGCHLD
May 29 11:44:36.525802 [WARNING] fpm_children_bury(), line 213: child
28942 (pool default) exited on signal 15 SIGTERM after 144.895942
seconds from start
May 29 11:44:36.527672 [NOTICE] fpm_children_make(), line 350: child
29010 (pool default) started
php-slow.log:
May 29 11:44:19.532015 pid 28942 (pool default)
script_filename = /b/squirrel/tttit.php
[0x08044d60] sleep() /b/squirrel/tttit.php:5
[0x08044eb0] i_am_idiot() /b/squirrel/tttit.php:6
[0x08045000] i_am_idiot() /b/squirrel/tttit.php:6
[0x08045150] i_am_idiot() /b/squirrel/tttit.php:6
[0x08045260] i_am_idiot() /b/squirrel/tttit.php:9
[WARNING] fpm_request_check_timed_out(), line 130: child XXXX, script
'/some/path/index.php5' (pool default) executing too slow (20.096824
sec), logging
[NOTICE] fpm_got_signal(), line 48: received SIGCHLD
[NOTICE] fpm_children_bury(), line 188: child XXXXX stopped for tracing
[NOTICE] fpm_php_trace(), line 390: about to trace XXXXX
[NOTICE] fpm_php_trace(), line 418: finished trace of XXXXX
XXXXX (pool default)
script_filename = /some/path/index.php
судя по ps axu | grep php-cgi пхп ничего не делает (памяти не ест,
проц ему не нужен)
перезапустил с помощью kill
начал нормально работать
какая ещё нужна информация?