2009-07-06 60 views
1

我正在寫一個內部服務,需要觸摸一個長時間運行的進程的mod_perl2實例。這個工作是從HTTP POST中觸發的,並且他們的mod_perl處理程序將其選中並完成工作。這可能需要很長時間,並且可以異步處理,所以我希望在運行時可以終止HTTP連接。是否有與PHP的ignore_user_abort()等效的mod_perl2/Perl 5?

PHP有一個函數ignore_user_abort(),當與正確的頭文件結合使用時,可以提前關閉HTTP連接,同時使進程繼續運行(此技術在此處提及幾次)。

Perl是否具有相同的功能?我還沒有找到一個。

回答

3

好吧,我想通了。

Mod_perl在這裏有PHP的'相反'問題。默認情況下,即使連接被中止,mod_perl進程仍處於打開狀態,默認情況下PHP會關閉進程。

Practical mod_perl book說如何處理中止連接。

(順便說一句,對於這個特定問題的目的,任務隊列在名單比「斷開」 HTTP進程更低)

#setup headers 
$r->content_type('text/html'); 
$s = some_sub_returns_string(); 

$r->connection->keepalive(Apache2::Const::CONN_CLOSE); 
$r->headers_out()->{'Content-Length'} = length($s); 

$r->print($s); 
$r->rflush(); 

# 
# !!! at this point, the connection will close to the client 
# 

#do long running stuff 
do_long_running_sub(); 
0

你可能想看看使用一個作業隊列。這裏是由Zend提供的one,它可以讓你開始後臺處理工作。應該有一些這些可供選擇的PHP和Perl。

這裏是另一個線程,談論this問題和article在一些PHP選項。我不是貝爾和尚,所以我會把這些工具的建議留給別人。

相關問題