2010-04-07 6 views
3

J'ai une application fonctionnant sous Catalyst + FastCGI. Et je le veux fork() pour faire un peu de travail en arrière-plan.
J'ai utilisé ce code pour CGI clair depuis longtemps (et cela a fonctionné):Quelle est la bonne façon de fork() dans FastCGI?

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 

J'ai essayé quelques variations sur ce FastCGI, mais sans succès. Comment faut-il forger sous FastCGI?

Mise à jour: Voici ce que j'ai maintenant:

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

J'envoie la demande d'appel AJAX, et ont l'erreur « 502 Passerelle » dans la console Firebug.

+0

S'il vous plaît, donnez plus d'informations. Qu'avez-vous essayé, et quelle erreur/comportement a-t-il donné? –

Répondre

2

Cette partie ne va pas bien fonctionner avec FastCGI:

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

Vous quittez dans le processus parent, ainsi cessera de répondre aux demandes de FastCGI.

Les setsid() s et close() s doivent démoniser votre processus d'arrière-plan. Cela peut ou non être nécessaire dans votre cas.

1

Je pense que cette FAQ a la bonne réponse: http://www.fastcgi.com/docs/faq.html#Perlfork

Vous devriez faire $request->Detach(); avant la fourche, et $request->Attach(); après la pièce de fork de code est fait, où la demande de $ est l'objet FCGI courant. Au moins, cela a fonctionné pour moi.

Dans le cas de Catalyst :: Engine :: FastCGI, vous devrez peut-être patcher le Catalyst :: Engine :: FastCGI pour accéder à la variable $request, car elle est locale à la méthode run() (dans la version c'est actuellement sur CPAN).

Questions connexes