конфиг php-fpm - обсуждение.

2 views
Skip to first unread message

Alexandre Kalendarev

unread,
Apr 8, 2008, 7:42:42 AM4/8/08
to highloa...@googlegroups.com
Андрей предложил структуру конфига сделать как у гникса.

Приблизительно, то что получилось в аттачменте.

пишу парсер (сканер) конфига.

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

например, данные секции global хранить в структуре cfg_global,
данные секции wokers хранить в структуре cfg_wokers
данные секции pool хранить в массиве структур cfg_pool[n], n - кол-во пулов.

некоторые секции, такие как listen_options носят чисто формальный характер (для удобочитаемости), т.е. сами данные, могут находится в структуре cfg_pool

Если есть у кого какие замечания по структуре, или организации данных конфига то готов к критике.

Александр

php-frm.conf

Serge Volkov

unread,
Apr 8, 2008, 1:13:45 PM4/8/08
to highload-php-ru
On 8 апр, 15:42, Alexandre Kalendarev <akal...@mail.ru> wrote:
> Андрей предложил структуру конфига сделать как у гникса.

C-Style конфиг это здорово! читабельность на порядок выше, большинство
админов имеют большой опыт девелопинга на C/perl/PHP/Java/etc.
соответственно шанс накосячить в таком конфиге минимален.

> пишу парсер (сканер) конфига.

Может взять ngx_conf_file.c и адаптировать под свои нужды? ох как мне
не хватает директивы "include" оттуда...

С другой стороны есть мнения:
On somedate, Народная пословица wrote:
> От добра добра не ищут.

On somedate, Народная пословица wrote:
> Лучшее - враг хорошего.

On somedate, Анекдот wrote:
> Сидит программист, отлаживает программу. Подходит сынишка:
> -Папа, почему солнышко каждый день встаёт на востоке, а садится на западе?
> -Ты это проверял?
> -Проверял.
> -Хорошо проверял?
> -Хорошо.
> -Работает?
> -Работает.
> -Каждый день работает?
> -Да, каждый день.
> -Тогда ради бога, сынок, ничего не трогай, ничего не меняй!

есть над чем задуматься...

Alexandre Kalendarev

unread,
Apr 8, 2008, 1:22:52 PM4/8/08
to highloa...@googlegroups.com
> Может взять ngx_conf_file.c и адаптировать под свои нужды? ох как мне
> не хватает директивы "include" оттуда...

было предложено использовать генератор лексем re2c, который генерит парсер. Быстро и красиво.
где-то неделю у меня ушло на опробацию решения, вот теперь дошли руки до реализации, времени катострофически не хватает, но стараюсь как-то помочь проекту.

а сами замечания по структуре конфига есть?

Andrei Nigmatulin

unread,
Apr 8, 2008, 1:36:47 PM4/8/08
to highloa...@googlegroups.com

Структура то, что надо. Детали отшлифую, когда буду все сводить воедино.


--
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

Serge Volkov

unread,
Apr 8, 2008, 1:55:11 PM4/8/08
to highload-php-ru
On 8 апр, 21:22, Alexandre Kalendarev <akal...@mail.ru> wrote:
> было предложено использовать генератор лексем re2c, который генерит парсер.
Что из себя представляет этот re2c я к сожалению не знаю.. не
доводилось его использовать. но есть мнение что завязать депендинг
сборки PHP ещё на одну библиотеку ни есть гуд... будет время -
посмотрю на этого зверя.

> а сами замечания по структуре конфига есть?
На первый взгляд все красиво и логично. про "include" не забудь
пожалуйста.

Andrei Nigmatulin

unread,
Apr 8, 2008, 2:07:30 PM4/8/08
to highloa...@googlegroups.com
On Tuesday 08 April 2008 21:55, Serge Volkov wrote:
> On 8 апр, 21:22, Alexandre Kalendarev <akal...@mail.ru> wrote:
> > было предложено использовать генератор лексем re2c, который генерит
> > парсер.
>
> Что из себя представляет этот re2c я к сожалению не знаю.. не
> доводилось его использовать. но есть мнение что завязать депендинг
> сборки PHP ещё на одну библиотеку ни есть гуд... будет время -
> посмотрю на этого зверя.

Это как раз не библиотека, а кодогенератор. На входе у него специальный язык -
смесь си и regex выражений, на выходе - чистый си, без всяких зависимостей. В
php-fpm будет включен и исходник re2c и готовый .с файл, для удобства.

Alexandre Kalendarev

unread,
Apr 8, 2008, 2:08:56 PM4/8/08
to highloa...@googlegroups.com
> On 8 апр, 21:22, Alexandre Kalendarev <akal...@mail.ru> wrote:
> > было предложено использовать генератор лексем re2c, который генерит парсер.
> Что из себя представляет этот re2c я к сожалению не знаю.. не
> доводилось его использовать. но есть мнение что завязать депендинг
> сборки PHP ещё на одну библиотеку ни есть гуд... будет время -
> посмотрю на этого зверя.

в двух словах re2c- это генератор с-кода на основе лексем регулярных выражений и конструкций #define.
по данным лексемам генерится в соответствии с внутренним алгоритмом си-код парсера, т.е. это вспомогательная тулза, на основе которой будет сгенерирован код парсера конфига, который просто напросто будет включен в дистрибутив. с самим re2c оконечный пользователь иметь дело не будет ни каким боком.

> > а сами замечания по структуре конфига есть?
> На первый взгляд все красиво и логично. про "include" не забудь пожалуйста.

Лично я не представляю каким боком впихнуть инклуде,
я так понимаю - проинклудить разные части конфига? Тогда я продумаю над этим вопросом, пока бы реализовать в наименьшем формате (один с-style конфиг).

Александр

Serge Volkov

unread,
Apr 8, 2008, 2:18:09 PM4/8/08
to highload-php-ru
On 8 апр, 22:07, Andrei Nigmatulin <andrei.nigmatu...@gmail.com>
wrote:
> Это как раз не библиотека, а кодогенератор. На входе у него специальный язык -
> смесь си и regex выражений, на выходе - чистый си, без всяких зависимостей. В
> php-fpm будет включен и исходник re2c и готовый .с файл, для удобства.

О-как! ну тогда этот зверёк "то что доктор прописал"! обязательно
уделю время посмотреть на него!

Serge Volkov

unread,
Apr 8, 2008, 2:36:23 PM4/8/08
to highload-php-ru
On 8 апр, 22:08, Alexandre Kalendarev <akal...@mail.ru> wrote:
> я так понимаю - проинклудить разные части конфига?
Совершенно верно. хотелось-бы иметь функционал аналогичный инклюду в
nginx-е:
http://sysoev.ru/nginx/docs/ngx_core_module.html#include

On 8 апр, 22:08, Alexandre Kalendarev <akal...@mail.ru> wrote:
> Тогда я продумаю над этим вопросом,
Спасибо!

Alex Vorona

unread,
Apr 8, 2008, 2:47:34 PM4/8/08
to highloa...@googlegroups.com
Alexandre Kalendarev пишет:

> а сами замечания по структуре конфига есть?
>
вместо

pool {
# Name of pool. Used in logs and stats.
name default;

может быть

pool <name> {

по аналогии с location в nginx?

Dmitriy MiksIr

unread,
Apr 8, 2008, 6:52:02 PM4/8/08
to highloa...@googlegroups.com
А вот вопрос, как с наследованием? Вроде бы оно сейчас есть (ну или точно помню - обсуждалось). С одной стороны можно описать pool default... с другой стороны, если уж делать иерархическую схему, то тогда делать возможность размещения некоторых директив внутри блока воркеров, а уж в блоке пула их подхватывать или переопределять

08.04.08, Alexandre Kalendarev <aka...@mail.ru> написал(а):

Andrei Nigmatulin

unread,
Apr 8, 2008, 7:01:55 PM4/8/08
to highloa...@googlegroups.com
On Wednesday 09 April 2008 02:52, Dmitriy MiksIr wrote:
> А вот вопрос, как с наследованием? Вроде бы оно сейчас есть (ну или точно
> помню - обсуждалось). С одной стороны можно описать pool default... с
> другой стороны, если уж делать иерархическую схему, то тогда делать
> возможность размещения некоторых директив внутри блока воркеров, а уж в
> блоке пула их подхватывать или переопределять

Можно как-то так

pool template1 {
...
}

pool site1 {
defaults template1;
...
listen 9000;
...

Alexandre Kalendarev

unread,
Apr 9, 2008, 12:43:55 AM4/9/08
to highloa...@googlegroups.com

> Можно как-то так
>
> pool template1 {
> ...
> }
>

это существенное добавление, вставка <имени> перед началом секции - учтено.


Александр

Serge Volkov

unread,
Apr 9, 2008, 10:31:32 AM4/9/08
to highload-php-ru
On 9 апр, 08:43, Alexandre Kalendarev <akal...@mail.ru> wrote:
> это существенное добавление, вставка <имени> перед началом секции - учтено.

abstract pool template1 {...}
pool somepool extends template1 {...}

Dmitriy MiksIr

unread,
Apr 9, 2008, 10:38:45 AM4/9/08
to highloa...@googlegroups.com
Это уже, знаете ли, не nginx-style, это уже какое-то программистское извращение.

09.04.08, Serge Volkov <Par...@gmail.com> написал(а):

Serge Volkov

unread,
Apr 9, 2008, 10:51:22 AM4/9/08
to highload-php-ru
On 9 апр, 18:38, "Dmitriy MiksIr" <dmik...@gmail.com> wrote:
> Это уже, знаете ли, не nginx-style, это уже какое-то программистское
> извращение.

Про абстрактный пул(класс) в прошлом сообщении написал хохмы ради. а
вот сейчас подумалось - возможно-ли в качестве парсера конфига
использовать сам ПХП? идея конечно бредовая - но все-же...

Alexandre Kalendarev

unread,
Apr 10, 2008, 7:03:47 AM4/10/08
to highloa...@googlegroups.com

> Про абстрактный пул(класс) в прошлом сообщении написал хохмы ради. а
> вот сейчас подумалось - возможно-ли в качестве парсера конфига
> использовать сам ПХП? идея конечно бредовая - но все-же...
можно использовать все что угодно, но сам понимаешь - нужно все делать рационально.

Alexandre Kalendarev

unread,
Apr 10, 2008, 7:08:15 AM4/10/08
to highloa...@googlegroups.com
> Это уже, знаете ли, не nginx-style, это уже какое-то программистское
> извращение.

> > abstract pool template1 {...}


> > pool somepool extends template1 {...}
> >

полностью согласен,
остановимся на ранее предложенном варианте:

pool template1 {...}
pool somepool {

extends template1 // или иное ключевое слово
...}

Serge Volkov

unread,
Apr 10, 2008, 7:32:31 AM4/10/08
to highload-php-ru
On 10 апр, 15:03, Alexandre Kalendarev <akal...@mail.ru> wrote:
>
> можно использовать все что угодно, но сам понимаешь - нужно все делать рационально.

+1 но для поиска оптимального/рационального решения задачи стоит
рассматривать все возможные пути решения.

On 10 апр, 15:08, Alexandre Kalendarev <akal...@mail.ru> wrote:
> остановимся на ранее предложенном варианте:
>
> pool template1 {...}
> pool somepool {
> extends template1 // или иное ключевое слово
> ...}

Ага. Тогда ещё флажок а-ля "enabled false;" надо заложить (для
темплейтов)

Alexandre Kalendarev

unread,
Apr 10, 2008, 7:42:35 AM4/10/08
to highloa...@googlegroups.com
>Ага. Тогда ещё флажок а-ля "enabled false;" надо заложить (для
темплейтов)
заложим ;)

Dmitriy MiksIr

unread,
Apr 10, 2008, 8:02:53 AM4/10/08
to highloa...@googlegroups.com
А вообще может инклудами обойтись можно? =)

10.04.08, Alexandre Kalendarev <aka...@mail.ru> написал(а):

Andrei Nigmatulin

unread,
Apr 10, 2008, 8:37:30 AM4/10/08
to highloa...@googlegroups.com

Это уже есть в коде - если пул не имеет listening сокета - то это
автоматически template.

Serge Volkov

unread,
Apr 10, 2008, 8:48:20 AM4/10/08
to highload-php-ru
On 10 апр, 16:02, "Dmitriy MiksIr" <dmik...@gmail.com> wrote:
> А вообще может инклудами обойтись можно? =)
>

Александр выше писал что концепция re2c-шного парсера не позволяет с
ходу имплементировать инклюды :-( как я понял там нельзя повесить
хендлер на определённый тэг...

Alexandre Kalendarev

unread,
Apr 10, 2008, 9:10:52 AM4/10/08
to highloa...@googlegroups.com
>Александр выше писал что концепция re2c-шного парсера не позволяет с
>ходу имплементировать инклюды как я понял там нельзя повесить
>хендлер на определённый тэг...

инклуды реализуем следующим этапом.
я пока вижу следующий путь:
1) парсить первым проходом на #include и сделать один общий конфиг, который распарсить вторым проходом
2-й вариант) парсить файл, все инклуды обработать ка теги и сложить в стек, далее пропарсить каждый инклуд и данные добавить в конфиг_структуру.

как я вижу практическое применение, директивой #include хорошо включать пулы разных пользователей. т.е в принципе использовать инклуд только для пользователей.

мне кажется первый подход проще, тем более, если реализую парсинг данных, то сделать надстройку будет проще.


Александр


Serge Volkov

unread,
Apr 10, 2008, 9:30:28 AM4/10/08
to highload-php-ru
On 10 апр, 17:10, Alexandre Kalendarev <akal...@mail.ru> wrote:
> 1) парсить первым проходом на #include и сделать один общий конфиг, который распарсить вторым проходом

Имеется ввиду написать свой собственный "пред-парсер"?

Alexandre Kalendarev

unread,
Apr 10, 2008, 11:20:08 AM4/10/08
to highloa...@googlegroups.com
>Имеется ввиду написать свой собственный "пред-парсер"?

в каком-то роде - да,
это будет первый шаг парсинга, используя тот же re2c,
который собирет из трех-пяти конфигов - один.

вторым шагом - распарсить сводный конфиг.

Andrei Nigmatulin

unread,
Apr 10, 2008, 11:28:01 AM4/10/08
to highloa...@googlegroups.com

А зачем так сложно ?

Я думал сделать так - лексер бежит по тексту, на все найденные конструкции и
директивы вызываются callbacks с текущим контекстом конфигурации. Как только
попалась директива include - создается новый, дочерний контекст конфигурации,
открывается файл и лексер бежит по нему. Добежал до конца - вернулся к
предыдущему контексту.

re2c вроде это умеет, разве нет ?

Andrei Nigmatulin

unread,
Apr 10, 2008, 11:51:17 AM4/10/08
to highloa...@googlegroups.com
On Thursday 10 April 2008 19:28, Andrei Nigmatulin wrote:
> On Thursday 10 April 2008 19:20, Alexandre Kalendarev wrote:
> > >Имеется ввиду написать свой собственный "пред-парсер"?
> >
> > в каком-то роде - да,
> > это будет первый шаг парсинга, используя тот же re2c,
> > который собирет из трех-пяти конфигов - один.
> >
> > вторым шагом - распарсить сводный конфиг.
>
> А зачем так сложно ?
>
> Я думал сделать так - лексер бежит по тексту, на все найденные конструкции
> и директивы вызываются callbacks с текущим контекстом конфигурации. Как
> только попалась директива include - создается новый, дочерний контекст
> конфигурации, открывается файл и лексер бежит по нему. Добежал до конца -
> вернулся к предыдущему контексту.
>
> re2c вроде это умеет, разве нет ?

Судя по мануалу - умеет:

http://re2c.org/manual.html

SCANNER WITH STORABLE STATES

When the -f flag is specified, re2c generates a scanner that can store its
current state, return to the caller, and later resume operations exactly
where it left off.

Alexandre Kalendarev

unread,
Apr 10, 2008, 12:41:05 PM4/10/08
to highloa...@googlegroups.com
>Я думал сделать так - лексер бежит по тексту, на все найденные конструкции и
>директивы вызываются callbacks с текущим контекстом конфигурации. Как только
>попалась директива include - создается новый, дочерний контекст конфигурации,
>открывается файл и лексер бежит по нему. Добежал до конца - вернулся к
>предыдущему контексту.
>re2c вроде это умеет, разве нет ?
да можно и так, re2c позволяет.

но мне казалось, что лучше распарсить все за один проход.

OK, присмотрюсь к этому подходу.

Andrei Nigmatulin

unread,
Apr 10, 2008, 12:53:29 PM4/10/08
to highloa...@googlegroups.com

Это и будет один проход, разве не так ?

А вот так будет два:

> >Имеется ввиду написать свой собственный "пред-парсер"?
>
> в каком-то роде - да,
> это будет первый шаг парсинга, используя тот же re2c,
> который собирет из трех-пяти конфигов - один.
>
> вторым шагом - распарсить сводный конфиг.

Alexandre Kalendarev

unread,
Apr 10, 2008, 2:01:36 PM4/10/08
to highloa...@googlegroups.com
Согласен, учту

Александр

silly_sad

unread,
Apr 13, 2008, 8:35:42 AM4/13/08
to highloa...@googlegroups.com
Alexandre Kalendarev wrote:
> Андрей предложил структуру конфига сделать как у гникса.
>
> Приблизительно, то что получилось в аттачменте.
>
> пишу парсер (сканер) конфига.

кстати насчёт сериализации древовидных данных

http://sf.net/projects/urt

там синтакс тоже на {} построен

silly_sad

unread,
Apr 13, 2008, 10:12:05 AM4/13/08
to highloa...@googlegroups.com
Andrei Nigmatulin wrote:
> On Tuesday 08 April 2008 21:55, Serge Volkov wrote:
>> On 8 апр, 21:22, Alexandre Kalendarev <akal...@mail.ru> wrote:
>>> было предложено использовать генератор лексем re2c, который генерит
>>> парсер.
>> Что из себя представляет этот re2c я к сожалению не знаю.. не
>> доводилось его использовать. но есть мнение что завязать депендинг
>> сборки PHP ещё на одну библиотеку ни есть гуд... будет время -
>> посмотрю на этого зверя.

>
> Это как раз не библиотека, а кодогенератор. На входе у него специальный язык -
> смесь си и regex выражений, на выходе - чистый си, без всяких зависимостей. В
> php-fpm будет включен и исходник re2c и готовый .с файл, для удобства.

незнаю что в данном случае более удобно, но мне лично офигенно
понравился "The Lemon Parser Generator"

На входе у него БНФ (помешанный с С)
на выходе чистый С
тоже без всяких зависимостей

Andrei Nigmatulin

unread,
Apr 13, 2008, 10:18:58 AM4/13/08
to highloa...@googlegroups.com

Спасибо, посмотрю.

Reply all
Reply to author
Forward
0 new messages