2012-03-12 9 views
1

私はmod_fcgidの下でいくつかのFastCGIスクリプトを実行しています。スクリプトを変更すると自動的にリロードされます。変更されたときにmod_fcgidで実行されているPerlスクリプトを再起動するには?

mod_fastcgiの下で、あなたは

FastCgiConfig -autoUpdate 

は、まさにそれを行うには設定できますが、mod_fcgidは、そのようなオプションがありません。 これには誰かが適切な回避策を用意していますか?

私が思いついた最善のことは、次のとおりです。1つの以上の要求を処理した後に出て

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

。しかし、これは理想的ではありません。特に、複数のスクリプトインスタンスが実行されている場合、すべての古いインスタンスがもう一度実行して終了するまでにはかなりの時間がかかることがあります。

processRequestより前にexitを実行すると、エラーが発生するため、どちらも実行されません。

事前のおかげで、

- マイケル

答えて

4

これを行う正しい方法は少し微妙です。私はPlack::Loader::Restarterを見て、それを行う方法を教えてください。または、あなたがアプリをPlackで実行するように適応させてから、plackupの-rオプションを使って自動的にレスターターを読み込むことをお勧めします。あなたのアプリが

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

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

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

を変えるのと同じくらい簡単おそらく、あなたが期待するよりも簡単かもしれない適応させること(適切なネイティブPSGIアプリケーションを書くことでもよりよいですが、このバージョンでは、ほとんどの書き換えからあなたを節約しますあなたのアプリ)。

+0

ありがとうございます。 Plackを読んでみる必要があるようです... – mscha

2

私は、このすべてを試していないが、あなたのmod_fcgidの目的のためにModule::Refresh仕事がしませんか?

+0

これは興味深い考えです。それはうまくいくと思います。しかし、いくつかの単純なCGIスクリプトが、実際のコードを別のモジュールに入れなければならないのは残念です。とにかくありがとう。 – mscha

関連する問題