Можно сделать что нибудь чтоб из перла можно было бы перестартовать
nginx? А сделать релоад модуля из перла без рестарта?
Можно ли сделать не content-handler а что-либо иное на perl? Например
аналог апачного init, child-init-handler и других из mod_perl?
Тогда можно было бы сделать модуль аналогичный Apache::StatINC
который отлавливал бы изменение исходника и вызывал бы релоад
модуля.
По поводу рестарта можно что-то придумать, но не так, как сделано в
Apache::StatINC - куча stat(2) на каждый запрос, включая
запросы, которые никогда не попадут в mod_perl. Причём, как минимум
7 файлов в perl5.8 вообще никогда не изменятся за время работы сервера:
XSLoader.pm = /usr/local/lib/perl5/5.8.7/mach/XSLoader.pm
warnings/register.pm = /usr/local/lib/perl5/5.8.7/warnings/register.pm
Carp.pm = /usr/local/lib/perl5/5.8.7/Carp.pm
Exporter.pm = /usr/local/lib/perl5/5.8.7/Exporter.pm
strict.pm = /usr/local/lib/perl5/5.8.7/strict.pm
constant.pm = /usr/local/lib/perl5/5.8.7/constant.pm
warnings.pm = /usr/local/lib/perl5/5.8.7/warnings.pm
Ну и вообще на будущее интересно - что будет примерно из этого модуля
Будут обработчики фаз - perl_worker_init, perl_worker_exit,
perl_rewrite, perl_access, etc.
Будет обработчик ответа, полученного от upstream'а.
Будет обработчик выбора upstream'а.
Возможно, можно будет писать сложные обработчики, работающие с другими
серверами, примерно так, как это сделано внутри nginx'а:
sub handler1 {
$r->handler = handler2;
rc = start_long_operation1;
if (rc != OK) {
return rc;
}
handler2;
}
sub handler2 {
$r->handler = handler3;
rc = start_long_operation2;
if (rc != OK) {
return rc;
}
handler3;
}
...
В принципе, можно даже ходить таким способом в базы данных, например,
postgres'овская libpq поддерживает неблокирующиеся соединения. А вот
с mysql - опаньки - там только блокирующиеся, нужно писать свою библиотеку.
Игорь Сысоев
http://sysoev.ru