| home / programming / perl / mod_perl / chap6 / 2 | [previous] [next] |
|
|
As the perlmod manpage explains, an
END subroutine is executed when the Perl interpreter
exits. In the mod_perl environment, the Perl interpreter exits only when the
child process exits. Usually a single process serves many requests before it
exits, so END blocks cannot be used if they are
expected to do something at the end of each request's processing.
If there is a need to run some code after a request has been processed,
the $r->register_cleanup( ) function should
be used. This function accepts a reference to a function to be called during
the PerlCleanupHandler phase, which behaves just
like the END block in the normal Perl environment.
For example:
$r->register_cleanup(sub { warn "$$ does cleanup\n" });
or:
sub cleanup { warn "$$ does cleanup\n" };$r->register_cleanup(\&cleanup);
will run the registered code at the end of each request, similar
to END blocks under mod_cgi.
As you already know by now, Apache::Registry
handles things differently. It does execute all END
blocks encountered during compilation of Apache::Registry
scripts at the end of each request, like mod_cgi does. That includes any END
blocks defined in the packages use( )d by the scripts.
If you want something to run only once in the parent process on
shutdown and restart, you can use register_cleanup( )
in startup.pl:
warn "parent pid is $$\n";Apache->server->register_cleanup(sub { warn "server cleanup in $$\n" });
This is useful when some server-wide cleanup should be performed when the server is stopped or restarted.
The CHECK and INIT
blocks run when compilation is complete, but before the program starts. CHECK
can mean "checkpoint," "double-check," or even just "stop."
INIT stands for "initialization." The
difference is subtle: CHECK blocks are run just
after the compilation ends, whereas INIT blocks
are run just before the runtime begins (hence, the -c
command-line flag to Perl runs up to CHECK blocks
but not INIT blocks).
Perl calls these blocks only during perl_parse(
), which mod_perl calls once at startup time. Therefore, CHECK
and INIT blocks don't work in mod_perl, for the
same reason these don't:
panic% perl -e 'eval qq(CHECK { print "ok\n" })'panic% perl -e 'eval qq(INIT { print "ok\n" })'
Under mod_perl, processes don't quit after serving a single request.
Thus, $^T gets initialized to the server startup
time and retains this value throughout the process's life. Even if you don't
use this variable directly, it's important to know that Perl refers to the value
of $^T internally.
For example, Perl uses $^T with the
-M, -C, or -A
file test operators. As a result, files created after the child server's startup
are reported as having a negative age when using those operators. -M
returns the age of the script file relative to the value of the $^T
special variable.
If you want to have -M report the
file's age relative to the current request, reset $^T,
just as in any other Perl script. Add the following line at the beginning of
your scripts:
local $^T = time;
You can also do:
local $^T = $r->request_time;
The second technique is better performance-wise, as it skips the
time( ) system call and uses the timestamp of the
request's start time, available via the $r->request_time
method.
If this correction needs to be applied to a lot of handlers, a more scalable solution is to specify a fixup handler, which will be executed during the fixup stage:
sub Apache::PerlBaseTime::handler {$^T = shift->request_time;return Apache::Constants::DECLINED;}
and then add the following line to httpd.conf:
PerlFixupHandler Apache::PerlBaseTime
Now no modifications to the content-handler code and scripts need to be performed.
When a Perl script is run from the command line, the shell invokes
the Perl interpreter via the #!/bin/perl directive,
which is the first line of the script (sometimes referred to as the shebang
line). In scripts running under mod_cgi, you may use Perl switches as described
in the perlrun manpage, such as -w,
-T, or -d. Under the Apache::Registry
handlers family, all switches except -w are ignored
(and use of the -T switch triggers a warning). The
support for -w was added for backward compatibility
with mod_cgi.
Most command-line switches have special Perl variable equivalents that allow them to be set/unset in code. Consult the perlvar manpage for more details.
mod_perl provides its own equivalents to -w and -T in the form of configuration directives, as we'll discuss presently.
Finally, if you still need to set additional Perl startup flags,
such as -d and -D, you can
use the PERL5OPT environment variable. Switches
in this variable are treated as if they were on every Perl command line. According
to the perlrun manpage, only the -[DIMUdmw]
switches are allowed.
| home / programming / perl / mod_perl / chap6 / 2 | [previous] [next] |
Created: March 27, 2003
Revised: July 23, 2003
URL: http://webreference.com/programming/perl/mod_perl/chap6/2