¿Cómo reiniciar el script Perl que se ejecuta bajo mod_fcgid cuando se modifica?
Pregunta
Estoy ejecutando algunos scripts FastCGI en mod_fcgid
, y me gustaría que se recargaran automáticamente cada vez que realice algún cambio en el script.
Bajo mod_fastcgi
, puedes configurar
FastCgiConfig -autoUpdate
hacer exactamente eso, pero mod_fcgid
no tiene esa opción.¿Alguien tiene una buena solución para esto?
Lo mejor que se me ocurrió es:
while (my $cgi = CGI::Fast->new()) {
processRequest($cgi);
exit if -M $0 < 0; # restart if script changed
}
que sale después de manejar una solicitud más.Pero esto no es ideal, especialmente cuando hay varias instancias del script ejecutándose, puede pasar bastante tiempo antes de que todas las instancias antiguas tengan la oportunidad de ejecutarse una vez más y salir.
si hago el exit
antes processRequest
, el usuario recibe un error, por lo que tampoco funcionará.
Gracias de antemano,
- Miguel
Solución
La forma correcta de hacerlo es un poco sutil.Yo recomendaría mirar Placa::Cargador::Reiniciador para saber cómo hacerlo, o mejor aún, adaptar su aplicación para que se ejecute en Plack y luego simplemente ejecutarla con plackup -r
opción para cargar el reiniciador automáticamente.Adaptar su aplicación puede ser más fácil de lo que espera, posiblemente tan fácil como cambiar
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);
});
(Escribir una aplicación PSGI nativa adecuada es aún mejor, pero esta versión le evita tener que reescribir la mayor parte de su aplicación).
Otros consejos
No he probado esto en absoluto, pero lo haría Module::Refresh
trabajar para tu mod_fcgid
propósitos?