Show Contents Previous Page Next Page
Chapter 9 - Perl API Reference Guide / Special Global Variables, Subroutines, and Literals Subroutines Subroutines with capitalized names have special meaning to Perl. Familiar
examples may include DESTROY and BEGIN. mod_perl
also recognizes these subroutines and treats them specially. BEGIN
Perl executes BEGIN blocks during the compile time of code
as soon as possible. The same is true under mod_perl. However,
since mod_perl normally only compiles scripts and modules once
in the parent server or once per child, BEGIN blocks in that code
will only be run once. Once a BEGIN block has run, it is immediately undefined by removing
it from the symbol table. In the mod_perl environment, this means
BEGIN blocks will not be run during each incoming request unless
that request happens to be the one that is compiling the code. When a .pm
module or other Perl code file is pulled in via require or use,
its BEGIN blocks will be executed as follows: Once at startup time if pulled in by the parent process by a PerlModule
directive or in the Perl startup script. Once per child process if not pulled in by the parent process. An additional time in each child process if Apache::StatINC
is loaded and the module is modified. An additional time in the parent process on each restart if PerlFreshRestart
is On. At unpredictable times if you fiddle with %INC yourself. Don't
do this unless you know what you are doing.
Apache::Registry scripts can contain BEGIN blocks
as well. In this case, they will be executed as follows: Once at startup time if pulled in by the parent process via Apache::RegistryLoader.
Once per child process if not pulled in by the parent process. An additional time in each child process if the script file is modified.
An additional time in the parent process on each restart if the script was
pulled in by the parent process with Apache::RegistryLoader and Perl-Fresh-Restart
is On.
END
In Perl, an END subroutine defined in a module or script
is executed as late as possible, that is, when the interpreter is being
exited. In the mod_perl environment, the interpreter does not
exit until the server is shutdown. However, mod_perl does make
a special case for Apache::Registry scripts. Normally, END blocks are executed by Perl during its perl_run()
function, which is called once each time the Perl program is executed, e.g.,
once per CGI (mod_cgi) script. However, mod_perl only
calls perl_run() once during server startup. Any END
blocks that are encountered during main server start-up, such as those pulled
in by PerlRequire or PerlModule , are suspended and run
at server shutdown time during the child_exit phase. Any END blocks that are encountered during compilation of Apache::Registry
scripts are called after the script has completed the response, including
subsequent invocations when the script is cached in memory. All other END
blocks encountered during other Perl*Handler callbacks (e.g., PerlChildInitHandler)
will be suspended while the process is running and called only during child_exit
when the process is shutting down. Module authors may wish to use $r->register_cleanup as an
alternative to END blocks if this behavior is not desirable.
Magic Literals Show Contents Go to Top Previous Page Next Page Perl recognizes a few magic literals during script compilation. By and large,
they act exactly like their counterparts in the standalone Perl interpreter.
__END__
This token works just as it does with the standalone Perl interpreter,
causing compilation to terminate. However, this causes a problem for Apache::Registry
scripts. Since the scripts are compiled inside of a subroutine, using __END__
will cut off the enclosing brace, causing script compilation to fail. If
your Apache::Registry scripts use this literal, they will not run.
In partial compensation for this deficiency, mod_perl lets
you use the __END__ token anywhere in your server configuration
files to cut out experimental configuration or to make a notepad space that
doesn't require you to use the # comment token on each line.
Everything below the __END__ token will be ignored.
Special Package Globals Show Contents Go to Top Previous Page Next Page There are a number of useful globals located in the Apache::Server
namespace that you are free to use in your own modules. Unless otherwise specified,
treat them as read-only. Changing their values will lead to unpredictable
results.
$Apache::Server::CWD
This variable is set to the directory from which the server was started.
$Apache::Server::Starting
If the code is running in the parent server when the server is first started,
the value is set to 1 ; otherwise, it is set to 0 .
$Apache::Server::ReStarting
If the code is running in the parent server when the server is restarted,
this variable will be true; otherwise, it will be false. The value is incremented
each time the server is restarted.
$Apache::Server::SaveConfig
As described in Chapter 8, <Perl>
configuration sections are compiled inside the Apache::ReadConfig
namespace. This namespace is normally flushed after mod_perl
has finished processing the section. However, if the $Apache::Server::SaveConfig
variable is set to a true value, the namespace will not be flushed, making
configuration data available to Perl modules at request time.
<Perl>
$Apache::Server::SaveConfig = 1;
$DocumentRoot = ...
...
</Perl>
At request time, the value of $DocumentRoot can be accessed
with the fully qualified name $Apache::ReadConfig::DocumentRoot .
The next chapters show the Apache API from the perspective of the C-language
programmer, telling you everything you need to know to squeeze the last drop
of performance out of Apache by writing extension modules in a fast compiled
language. Show Contents Go to Top Previous Page Next Page Copyright © 1999 by O'Reilly & Associates, Inc. |