2012-03-12 83 views
1

我正在運行mod_fcgid下的一些FastCGI腳本,並且我希望那些在我對腳本進行任何更改時自動重新加載。如何在更改後重新啓動在mod_fcgid下運行的Perl腳本?

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,用戶會收到一個錯誤,因此也不會執行任何操作。

由於提前,

邁克爾 -

回答

4

做正確的做法是有點微妙。我建議在看Plack::Loader::Restarter如何做到這一點,或者更好的適應你的應用程序上運行普拉克,然後只是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應用程序甚至更好,但是這個版本從重寫大部分爲您節省你的應用程序)。

+0

謝謝。看起來我需要閱讀Plack ... – mscha 2012-03-26 13:51:57

2

我沒試過所有,但會Module::Refresh工作,爲您的mod_fcgid目的是什麼?

+0

這是一個有趣的想法,我想它會工作。然而,對於一些簡單的CGI腳本來說,將實際的代碼放在一個單獨的模塊中是有點矯枉過正的。不過謝謝。 – mscha 2012-03-12 23:02:32

相關問題