更改后如何重启mod_fcgid下运行的Perl脚本?

时间:2012-03-12 21:47:43

标签: perl mod-fcgid

我正在mod_fcgid下运行一些FastCGI脚本,我希望每当我对脚本进行任何更改时都会自动重新加载。

mod_fastcgi下,您可以配置

FastCgiConfig -autoUpdate

要做到这一点,但mod_fcgid没有这样的选择。 任何人都有一个很好的解决方法吗?

我想出的最好的事情是:

while (my $cgi = CGI::Fast->new()) {
    processRequest($cgi);
    exit if -M $0 < 0;  # restart if script changed
}

在处理一个请求后退出。但这并不理想,特别是当有多个脚本实例运行时,可能需要一段时间才能让所有旧实例再次运行并退出。

如果我在exit之前执行processRequest,则用户会收到错误,因此也不会这样做。

提前致谢,

- 迈克尔

2 个答案:

答案 0 :(得分:4)

正确的做法有点微妙。我建议查看Plack::Loader::Restarter如何做到这一点,或者更好地调整你的应用程序以在Plack上运行,然后使用plackup的-r选项启动它以自动加载重启器。调整您的应用可能比您预期的更容易,可能就像更改一样简单

use CGI::Fast;
while (my $cgi = CGI::Fast->new) {
    processRequest($cgi);
}

use CGI::Emulate::PSGI;
use CGI;

my $app = CGI::Emulate::PSGI->handler(sub {
    my $cgi = CGI->new;
    processRequest($cgi);
});

(编写一个合适的原生PSGI应用程序甚至更好,但这个版本可以帮助您避免重写大部分应用程序。)

答案 1 :(得分:2)

我根本没有尝试过,但是Module::Refresh是否适用于mod_fcgid目的?