【问题标题】:What's the proper way to fork() in FastCGI?在 FastCGI 中 fork() 的正确方法是什么?
【发布时间】:2011-02-05 05:40:09
【问题描述】:

我有一个在 Catalyst+FastCGI 下运行的应用程序。我想让fork() 在后台做一些工作。
我很久以前就将这段代码用于纯 CGI(并且它有效):

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 Bad Gateway”错误。

【问题讨论】:

  • 请提供更多信息。您尝试了什么,它给出了什么错误/行为?

标签: perl ipc fork fastcgi


【解决方案1】:

这部分不适用于 FastCGI:

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

您将退出父进程,因此它将停止响应 FastCGI 请求。

setsid()s 和 close()s 用于守护你的后台进程。在您的情况下,这可能是必要的,也可能不是。

【讨论】:

    【解决方案2】:

    我认为这个常见问题解答有正确的答案: https://fastcgi-archives.github.io/FastCGI_FAQ.html#Perlfork

    你应该在 fork 之前执行$request->Detach();,在 fork 代码完成之后执行$request->Attach();,其中 $request 是当前的 FCGI 对象。至少,它对我有用。

    如果是 Catalyst::Engine::FastCGI,您可能需要修补 Catalyst::Engine::FastCGI 以访问 $request 变量,因为它是那里的 run() 方法的本地变量(在当前在 CPAN 上的版本)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 2010-09-06
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 2017-01-08
      相关资源
      最近更新 更多