Recipe 11.15 Speeding Up Perl CGI Programs with mod_perl
Problem
You have existing functional Perl CGI programs and want them to run
faster.
Solution
If you have the
mod_perl module installed, you can configure
it to run your Perl CGI programs, instead of running
mod_cgi. This gives you a big performance boost,
without having to modify your CGI code.
There are two slightly different ways to do this.
For Apache 1.3 and mod_perl Version 1:
Alias /cgi-perl/ /usr/local/apache/cgi-bin/
<Location /cgi-perl>
Options ExecCGI
SetHandler perl-script
PerlHandler Apache::PerlRun
PerlSendHeader On
</Location>
Alias /perl/ /usr/local/apache/cgi-bin/
<Location /perl>
Options ExecCGI
SetHandler perl-script
PerlHandler Apache::Registry
PerlSendHeader On
</Location>
For Apache 2.0 and mod_perl Version 2, the
syntax changes slightly:
PerlModule ModPerl::PerlRun
Alias /cgi-perl/ /usr/local/apache2/cgi-bin/
<Location /cgi-perl>
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI
</Location>
PerlModule ModPerl::Registry
Alias /perl/ /usr/local/apache2/cgi-bin/
<Location /perl>
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
Options +ExecCGI
</Location>
Discussion
By using mod_perl's CGI modes,
you can improve the performance of existing CGI programs without
modifying the CGI code itself in any way. Given the previous
configuration sections, a CGI program that was previously accessed
via the URL http://www.example.com/cgi-bin/program.cgi
will now be accessed via the URL http://www.example.com/cgi-perl/program.cgi
to run it in PerlRun mode or
via the URL http://www.example.com/perl/program.cgi to
run it in Registry mode.
The primary difference between
PerlRun and Registry is that,
in Registry, the program code itself is cached
after compilation, whereas in PerlRun mode, it
is not. While this means that code run under
Registry is faster than that executed under
PerlRun, it also means that a greater degree of
code quality is required. In particular, global variables and other
careless coding practices may cause memory leaks, which, if run in
cached mode, could eventually cause the server to run out of
available memory.
When writing Perl CGI code to run under
mod_perl, and, in general, when writing any Perl
code, it is recommended that you place the following two lines at the
top of each program file, following the #! line:
use strict;
use warnings;
Code that runs without error messages, with these two lines in them,
runs without problems under Registry.
|
strict is not available prior to Perl 5, and
warnings is not available prior to Perl 5.6. In
versions of Perl earlier than 5.6, you can get behavior similar to
warnings by using the -w flag to
Perl. This is accomplished by adding it to the #!
line of your Perl programs:
#!/usr/bin/perl -w
|
|
See Also
Programming Perl, Third Edition, by Larry
Wall, Tom Christiansen, and Jon Orwant
(O'Reilly)
|