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

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top