2009-06-26 6 views
3

Einige Zitat aus praktischen Mod_perlBerufung aufzuräumen Code in mod_perl Umgebung

„Normalerweise zu holen, ein einzelner Prozess dient viele Anfragen, bevor es beendet wird, so END Blöcke nicht verwendet werden können, wenn sie erwartet werden, etwas an das zu tun Ende der Verarbeitung jeder Anfrage. "

Also, in meinem a.cgi Skript:

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. 
    } 
} 

Das Buch beginnt wieder $ r-> register_cleanup (sub {#cleanup});

jedoch

  1. Wie ich $ r in a.cgi Skript erhalten können?
  2. Kann das Unterprogramm auf die Variable my scope flag zugreifen?
  3. Soll dieses $ r-> register_cleanup in einem cgi-Skript platziert werden? Ich möchte nur, dass der Bereinigungscode für ein cgi-Skript ausgeführt wird. Nicht der Rest.

Antwort

1

Wenn ich das richtig verstehe, haben Sie ein Skript, das Sie beide unter mod_perl und als reine CGI ausgeführt werden soll und es klingt wie Sie Apache::Registry verwenden, dies zu tun.

Sie haben Cleanup-Code, den Sie ausführen möchten nur, wenn Sie als CGI-Skript ausgeführt werden.

Sie müssen erkennen, ob Sie unter mod_perl laufen oder nicht. Das ist ziemlich einfach. Der einfachste Weg ist, Ihre Umgebung zu überprüfen:

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

Sie nur eine Bereinigung Handler zu registrieren, wenn Sie etwas ausführen möchten, wenn Ihr Skript beendet unter Apache :: Registry.

Wenn Sie das tun wollen, sollten Sie Ihren Bereinigungscode in einen Unter platzieren und diese Unter von Ihrem Check-in der CGI-Aufruf:

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

und von Ihrem Cleanup-Handler:

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