2013-02-21 48 views
2

我正在使用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接管過程中,而不是讓它返回任何東西。

我知道這不像堆棧溢出問題那樣具體,但這種事情必須是一個常見問題,其他人如何解決它?

+2

你試過['fork'](http://perldoc.perl.org/functions/fork.html)嗎? – mob 2013-02-21 22:34:56

+0

謝謝暴徒,做到了! – 2013-02-22 00:30:01

回答

1

您可以使用fork(),但是我喜歡爲後臺處理推薦http://gearman.org/

像Gearman這樣的解決方案要好得多,因爲你的後臺進程不在Apache的進程鏈中。

如果使用gearman實現,您的進程將在Apache重新啓動後存活。它也更安全,因爲Gearman環境可以在chroot監獄中運行。

使用Gearman的一個不錯的副作用是您的後臺進程可以從其他機器甚至其他語言調用。

Gearman可以讓您輕鬆地從過程中收集數據,並且您可以輕鬆地將進度信息反饋給您的網絡應用程序。