Como reiniciar o Perl script executando sob mod_fcgid quando mudou?
Pergunta
Eu estou correndo alguns FastCGI scripts em mod_fcgid
, e eu gostaria aqueles para recarregar automaticamente sempre que efectuar quaisquer alterações para o script.
Sob mod_fastcgi
, você pode configurar
FastCgiConfig -autoUpdate
para fazer exatamente o que, mas mod_fcgid
não tem essa opção.Alguém tem uma boa solução para isso?
A melhor coisa que eu inventei, é:
while (my $cgi = CGI::Fast->new()) {
processRequest($cgi);
exit if -M $0 < 0; # restart if script changed
}
o que sai depois de lidar com mais um pedido.Mas isso não é o ideal, especialmente quando existem várias instâncias do script em execução, ele pode levar bastante tempo antes de todos os casos tiveram uma oportunidade de correr uma vez mais e sair.
Se eu fizer o exit
antes de processRequest
, o utilizador recebe um erro, de modo que não fazer.
Obrigado antecipadamente,
– Michael
Solução
O caminho certo para fazê-lo é um pouco sutil.Eu recomendaria olhando para Plack::Loader::Restarter para saber como fazê-lo, ou, melhor ainda se adaptando você aplicativo para ser executado em Plack e, em seguida, basta lançá-lo com plackup do -r
opção para carregar o restarter automaticamente.Adaptando-se a sua aplicação pode ser mais fácil do que você espera, possivelmente tão fácil como mudar
use CGI::Fast;
while (my $cgi = CGI::Fast->new) {
processRequest($cgi);
}
para
use CGI::Emulate::PSGI;
use CGI;
my $app = CGI::Emulate::PSGI->handler(sub {
my $cgi = CGI->new;
processRequest($cgi);
});
(escrever um bom nativo PSGI app é ainda melhor, mas esta versão salva de reescrever a maioria de sua aplicação).
Outras dicas
Eu não tentei isso, mas seria Module::Refresh
o trabalho para a sua mod_fcgid
fins?