2009-07-06 12 views
1

J'écris un service interne qui doit toucher une instance de mod_perl2 pour un processus de longue durée. Le travail est déclenché à partir d'un POST HTTP, et le gestionnaire mod_perl le récupère et fait le travail. Cela peut prendre du temps et est prêt à être traité de manière asynchrone, alors j'espérais pouvoir mettre fin à la connexion HTTP pendant son exécution.Existe-t-il un mod_perl2/Perl 5 équivalent à ignore_user_abort() de PHP?

PHP a une fonction ignore_user_abort(), qui, lorsqu'elle est combinée avec les bons en-têtes, peut fermer la connexion HTTP plus tôt, tout en laissant le processus en cours (cette technique est mentionnée ici sur SO à quelques reprises).

Est-ce que Perl a un équivalent? Je n'ai pas encore réussi à en trouver un.

Répondre

3

Ok, je l'ai compris.

Mod_perl a le problème 'opposé' de PHP ici. Par défaut, les processus mod_perl restent ouverts, même si la connexion est interrompue, où PHP ferme par défaut le processus. Le Practical mod_perl book indique comment gérer les connexions interrompues.

(BTW, pour l'application de ce problème spécifique, une file d'attente est plus bas sur la liste d'un « déconnexion » processus de http)

#setup headers 
$r->content_type('text/html'); 
$s = some_sub_returns_string(); 

$r->connection->keepalive(Apache2::Const::CONN_CLOSE); 
$r->headers_out()->{'Content-Length'} = length($s); 

$r->print($s); 
$r->rflush(); 

# 
# !!! at this point, the connection will close to the client 
# 

#do long running stuff 
do_long_running_sub(); 
0

Vous pouvez envisager d'utiliser une file d'attente de travaux pour cela. Voici one fourni par Zend qui vous permettra de démarrer des tâches de traitement en arrière-plan. Il devrait y avoir un certain nombre de ces choix parmi php et perl.

Voici un autre fil qui parle de problème this et un article sur certaines options php. Je ne suis pas perl moine, donc je vais laisser des suggestions sur ces outils à d'autres.