在 FastCGI 中 fork() 的正确方法是什么?

发布于 2024-08-28 03:49:10 字数 968 浏览 5 评论 0原文

我有一个在 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下应该如何进行fork?

更新:这就是我现在所拥有的:

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

I have an app running under Catalyst+FastCGI. And I want it to fork() to do some work in background.
I used this code for plain CGI long ago (and it worked):

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

I tried some variations on this under FastCGI but with no success. How should forking be done under FastCGI?

Update: This is what I have now:

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() 

I send the request with AJAX call, and have the "502 Bad Gateway" error in the firebug console.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

债姬 2024-09-04 03:49:10

我认为这个常见问题解答有正确的答案:
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 上的版本中)。

I think this FAQ has the right answer:
https://fastcgi-archives.github.io/FastCGI_FAQ.html#Perlfork

You should do $request->Detach(); before the fork, and $request->Attach(); after the forking piece of code is done, where $request is the current FCGI object. At least, it worked for me.

In case of Catalyst::Engine::FastCGI you may need to patch the Catalyst::Engine::FastCGI to get access to the $request variable, since it is local to the run() method there (in the version that is currently on CPAN).

原野 2024-09-04 03:49:10

这部分不能很好地与 FastCGI 配合使用:

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

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

setid() 和 close() 用于守护您的后台进程。对于您的情况来说,这可能是必要的,也可能不是必要的。

This part isn't going to work well with FastCGI:

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

You would exit in the parent process, thus it will stop responding to FastCGI requests.

The setsid()s and close()s are to daemonize your background process. This may or may not be necessary in your case.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文