Come riavviare lo script perl in esecuzione sotto mod_fcgid quando è cambiato?
Domanda
Sto eseguendo alcuni script FastCGI sotto mod_fcgid
, e vorrei che quelli di ricaricare automaticamente ogni volta che apporti modifiche allo script.
Sotto mod_fastcgi
, è possibile configurare
FastCgiConfig -autoUpdate
.
Per fare esattamente questo, ma mod_fcgid
non ha un'opzione del genere.
Qualcuno ha una buona soluzione per questo?
La cosa migliore con cui ho inventato, è:
while (my $cgi = CGI::Fast->new()) {
processRequest($cgi);
exit if -M $0 < 0; # restart if script changed
}
.
che esce dopo aver gestito un'altra richiesta.Ma questo non è ideale, specialmente quando ci sono più istanze dello script in esecuzione, potrebbe richiedere un bel po 'prima che tutte le vecchie istanze abbiano avuto un'opportunità per scappare ancora una volta e uscire.
Se faccio il exit
prima di processRequest
, l'utente riceve un errore, quindi non lo farà.
Grazie in anticipo,
- Michael
Soluzione
Il modo giusto per farlo è un po 'sottile.Consiglierei di guardare a PLACK :: Loader :: RESTARTER per comefallo, o meglio ancora adattando l'app per eseguire su palato e quindi basta lanciarlo con l'opzione -r
di Plackup per caricare automaticamente il RESTARTER.Adattare la tua app potrebbe essere più facile di quanto ti aspetti, possibilmente facile come il cambio
use CGI::Fast;
while (my $cgi = CGI::Fast->new) {
processRequest($cgi);
}
.
a
use CGI::Emulate::PSGI;
use CGI;
my $app = CGI::Emulate::PSGI->handler(sub {
my $cgi = CGI->new;
processRequest($cgi);
});
.
(Scrivere un'applicazione PSGI nativa appropriata è ancora più bella, ma questa versione ti consente di riscrivere la maggior parte della tua app).
Altri suggerimenti
Non l'ho provato affatto, ma Module::Refresh
Lavoro per il tuo mod_fcgid
scopi?