Comment redémarrer script Perl en cours d'exécution en vertu de l'mod_fcgid quand il changé?
Question
Je suis de l'exécution de certains scripts sous FastCGI mod_fcgid
, et j'aimerais que ceux de recharger automatiquement à chaque fois que je faire des modifications pour le script.
En vertu de mod_fastcgi
, vous pouvez configurer
FastCgiConfig -autoUpdate
de faire exactement cela, mais mod_fcgid
n'ont pas une telle option.Quelqu'un a une bonne solution pour cela?
La meilleure chose que j'ai trouvé, c'est:
while (my $cgi = CGI::Fast->new()) {
processRequest($cgi);
exit if -M $0 < 0; # restart if script changed
}
qui sort après la manipulation demande d'une plus.Mais ce n'est pas l'idéal, surtout quand il ya plusieurs instances du script en cours d'exécution, il peut prendre un certain temps avant que toutes les anciennes instances ont eu l'occasion de courir une fois de plus et de sortie.
Si je ne l' exit
avant processRequest
, l'utilisateur obtient une erreur, donc ça va pas le faire non plus.
Merci d'avance,
– Michael
La solution
La bonne façon de le faire est un peu subtile.Je recommande de regarder Plack::Loader::Redémarrage pour savoir comment faire, ou mieux encore l'adaptation de vous application à exécuter sur Plack et puis il suffit de le lancer avec plackup de l' -r
possibilité de charger le redémarrage automatique.L'adaptation de votre application peut être plus facile que vous ne le pensez, peut-être aussi facile que de changer
use CGI::Fast;
while (my $cgi = CGI::Fast->new) {
processRequest($cgi);
}
pour
use CGI::Emulate::PSGI;
use CGI;
my $app = CGI::Emulate::PSGI->handler(sub {
my $cgi = CGI->new;
processRequest($cgi);
});
(la rédaction d'un bon natif PSGI application est encore plus belle, mais cette version vous permet d'économiser de la réécriture de la plupart de votre application).
Autres conseils
Je n'ai pas essayé cela, mais serait Module::Refresh
de travail pour votre mod_fcgid
fins?