我正在使用perl以XML格式返回數據集。現在我遇到了一種情況,我需要在將數據集發送到客戶端後進行一些清理。但有些地方,在mod perl和Apache的鏈中,輸出會一直持續到我的方法返回。如何使用mod perl運行後臺進程
我試圖用類似命令清除緩衝區。
$| =1;
STDOUT->flush(); # flush the buffer so the content is sent to the client and the finish hook can carry on, with out delaying the return.
if ($mod_perl_io){
$mod_perl_io->rflush;
}
然而,直到我的方法返回,我仍然沒有輸出。然後我發現我的瀏覽器正在等待連接關閉,並發現在頭文件中設置內容類型可以解決這個問題。
rint $cgi->header(-type => "text/plain; charset=UTF-8", -cookie => $config->{'cookie'});
還是沒有運氣,其實我一直在發送正確的標題。
所以我儘管最好的選擇是簡單地開始一個新的線程,讓我的方法返回。但是當我創建一個新的線程。
use threads ('yield',
'stack_size' => 64*4096,
'exit' => 'threads_only',
'stringify');
my $thr = threads->create('doRebuild', $dbconnect, $dbusername, $dbpassword, $bindir);
sub doRebuild {
my ($dbconnect, $dbusername, $dbpassword, $bindir) = @_;
1;
}
我得到一個segfault
[週五02月22日10時16分47秒2013] [聲明]兒童PID 26076退出信號分割故障(11)
從我讀過這個是由mod perl完成的,以確保線程安全運行。不知道這是否正確。
所以我想我會嘗試使用{} EXE
{exec 'perl', "$bindir/rebuild_needed_values.pl", qw('$dbconnect' '$dbusername' '$dbpassword');}
從我收集,這是由國防部的Perl接管過程中,而不是讓它返回任何東西。
我知道這不像堆棧溢出問題那樣具體,但這種事情必須是一個常見問題,其他人如何解決它?
你試過['fork'](http://perldoc.perl.org/functions/fork.html)嗎? – mob 2013-02-21 22:34:56
謝謝暴徒,做到了! – 2013-02-22 00:30:01