代码之家  ›  专栏  ›  技术社区  ›  Eugene Yarmash

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

  •  3
  • Eugene Yarmash  · 技术社区  · 15 年前

    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
    

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

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

    2 回复  |  直到 15 年前
        1
  •  3
  •   Ivan Kurmanov    13 年前

    我认为这个常见问题的答案是正确的: http://www.fastcgi.com/docs/faq.html#Perlfork

    你应该这么做 $request->Detach(); 在叉子前,还有 $request->Attach(); 分岔代码完成后,$request是当前的FCGI对象。至少,这对我有用。

    $request 变量,因为它是run()方法的本地变量(在当前CPAN上的版本中)。

        2
  •  2
  •   Leon Timmermans    15 年前

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

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

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