【问题标题】:How to restart Perl script running under mod_fcgid when changed?更改后如何重新启动在 mod_fcgid 下运行的 Perl 脚本?
【发布时间】:2012-03-12 21:47:42
【问题描述】:

我正在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
}

在处理一个请求后退出。但这并不理想,尤其是当脚本有多个实例运行时,所有旧实例可能需要很长时间才能有机会再次运行并退出。

如果我在processRequest 之前执行exit,用户会收到一个错误,所以也不会这样做。

提前致谢,

——迈克尔

【问题讨论】:

    标签: perl mod-fcgid


    【解决方案1】:

    正确的做法有点微妙。我建议查看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 应用程序会更好,但这个版本可以让您免于重写大部分应用程序)。

    【讨论】:

      【解决方案2】:

      我根本没有尝试过,但是 Module::Refresh 是否可以满足您的 mod_fcgid 目的?

      【讨论】:

      • 这是一个有趣的想法,我想它会奏效。但是,对于一些简单的 CGI 脚本来说,必须将实际代码放在单独的模块中,这有点矫枉过正。不过还是谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 2019-02-01
      • 1970-01-01
      • 2018-11-03
      • 2011-12-04
      • 2022-06-12
      相关资源
      最近更新 更多