Wie starte ich ein Perl-Skript neu, das unter mod_fcgid ausgeführt wird, wenn es geändert wurde?
Frage
Ich führe einige FastCGI-Skripte unter aus mod_fcgid
, und ich möchte, dass diese automatisch neu geladen werden, wenn ich Änderungen am Skript vornehme.
Unter mod_fastcgi
, können Sie konfigurieren
FastCgiConfig -autoUpdate
genau das zu tun, aber mod_fcgid
hat eine solche Option nicht.Hat jemand eine gute Problemumgehung dafür?
Das Beste, was mir eingefallen ist, ist:
while (my $cgi = CGI::Fast->new()) {
processRequest($cgi);
exit if -M $0 < 0; # restart if script changed
}
die beendet wird, nachdem eine weitere Anfrage bearbeitet wurde.Dies ist jedoch nicht ideal, insbesondere wenn mehrere Instanzen des Skripts ausgeführt werden. Es kann eine ganze Weile dauern, bis alle alten Instanzen erneut ausgeführt und beendet werden können.
Wenn ich das mache exit
Vor processRequest
, erhält der Benutzer eine Fehlermeldung, also ist das auch nicht der Fall.
Dank im Voraus,
– Michael
Lösung
Der richtige Weg, es zu tun, ist ein wenig subtil.Ich würde empfehlen, einen Blick darauf zu werfen Plack::Loader::Restarter Erfahren Sie, wie es geht, oder noch besser: Passen Sie Ihre App so an, dass sie auf Plack läuft, und starten Sie sie dann einfach mit Plackups -r
Option zum automatischen Laden des Restarters.Das Anpassen Ihrer App ist möglicherweise einfacher als erwartet, möglicherweise genauso einfach wie das Ändern
use CGI::Fast;
while (my $cgi = CGI::Fast->new) {
processRequest($cgi);
}
Zu
use CGI::Emulate::PSGI;
use CGI;
my $app = CGI::Emulate::PSGI->handler(sub {
my $cgi = CGI->new;
processRequest($cgi);
});
(Eine richtige native PSGI-App zu schreiben ist noch schöner, aber diese Version erspart Ihnen das Umschreiben des größten Teils Ihrer App.)
Andere Tipps
Ich habe das überhaupt noch nicht ausprobiert, würde es aber tun Module::Refresh
Arbeit für Sie mod_fcgid
Zwecke?