2010-04-07 45 views
3

我有一個應用程序運行在Catalyst + FastCGI下。我想要它fork()在後臺做一些工作。
我用普通的CGI這個代碼早就(和它的工作):在FastCGI中fork()的正確方法是什麼?

defined(my $pid = fork) or die "Can't fork: $!"; 
if ($pid) { 
    # produce some response   
    exit 0; 
} 

die "Can't start a new session: $!" if setsid == -1; 
close STDIN or die $!; 
close STDOUT or die $!; 
close STDERR or die $!; 
# do some work in background 

我想下的FastCGI,但沒有成功這方面的一些變化。在FastCGI下應該如何分叉?

更新:這是我現在有:

defined(my $pid = fork) or die "Can't fork: $!"; 
    if ($pid) { 
     $c->stash->{message} = 'ok'; 
     $c->detach($c->view('JSON')); 
    } 
    die "Can't start a new session: $!" if setsid == -1; 
    close STDIN or die $!; 
    close STDOUT or die $!; 
    close STDERR or die $!; 
    # do some work, then exit() 

我送與AJAX調用請求,並在Firebug控制檯的「502錯誤網關」的錯誤。

+0

請給,一些更多的信息。你試過了什麼,它給了什麼錯誤/行爲? – 2010-04-07 12:09:45

回答

2

這部分是不會FastCGI的效果很好,

if ($pid) { 
    # print response   
    exit 0; 
} 

你會退出的父進程,因此將停止響應FastCGI的請求。 ()s和close()s將守護進程的後臺進程。這可能或可能不需要你的情況。

1

我覺得這個常見問題有正確的答案: http://www.fastcgi.com/docs/faq.html#Perlfork

你應該分杈的代碼後做$request->Detach();叉前,和$request->Attach();完成,其中$請求是當前FCGI對象。至少,它對我有用。

在Catalyst :: Engine :: FastCGI的情況下,您可能需要修補Catalyst :: Engine :: FastCGI以訪問$request變量,因爲它對run()方法是本地的(在版本中目前在CPAN上)。

相關問題