2009-06-26 5 views
3

Certains citation à choisir mod_perl pratiqueappel à nettoyer le code dans un environnement mod_perl

« Habituellement, un seul processus sert de nombreuses demandes avant sa sortie, de sorte que les blocs de fin ne peuvent être utilisées si elles devraient faire quelque chose au fin du traitement de chaque demande. "

Donc, dans mon script a.cgi:

my $flag = 1; 

END { 
    # Value for $flag is undefined, if this script is run under mod_perl. 
    # END block code only executed when process to handle a.cgi exit. 
    # I wish to execute some code, just before process to handle a.cgi exit. 
    if ($flag) { 
     # clean up code. 
    } 
} 

Le livre $ r- recommence> register_cleanup (sous {#cleanup});

Cependant,

  1. Comment puis-je obtenir r $ dans le script a.cgi?
  2. Le sous-programme peut-il accéder à la variable flag my scope?
  3. Est-ce que $ r-> register_cleanup doit être placé dans un script.cgi? Je veux seulement que le code de nettoyage soit exécuté pour un script.cgi. Pas le reste.

Répondre

1

Si je comprends bien, vous avez un script que vous voulez exécuter à la fois sous mod_perl et en tant que CGI simple et il semble que vous utilisez Apache::Registry pour ce faire.

Vous avez un code de nettoyage que vous voulez exécuter seulement lorsque vous exécutez en tant que script CGI.

Vous devez détecter si vous utilisez ou non mod_perl. C'est assez facile. La façon la plus simple est de vérifier votre environnement:

unless ($ENV{MOD_PERL}) 
{ 
    #... cleanup code here. 
} 

Vous ne d'enregistrer un gestionnaire de nettoyage si vous voulez quelque chose à exécuter lorsque votre script se termine sous Apache :: Registry.

Si vous voulez, vous devez placer votre code de nettoyage dans un sous et appeler sous de votre chèque dans le CGI:

unless ($ENV{MOD_PERL}) 
{ 
    cleanup_sub(); 
} 

et de votre gestionnaire de nettoyage:

my $r = Apache->request; 
$r->register_cleanup(sub { cleanup_sub() });