=head1 NAME cgi_to_mod_perl - First steps needed to use mod_perl as a CGI replacement =head1 DESCRIPTION As the README and other mod_perl documents explain, mod_perl as a CGI replacement is only a small piece of what the package offers. However, it is the most popular use of mod_perl, this document is here so you can cut to the chase. =head1 INSTALLATION Read the INSTALL document, in most cases, nothing more is required than: perl Makefile.PL && make && make install =head1 CONFIGURATION For using mod_perl as a CGI replacement, the recommended configuration is as follows: Alias /perl/ /real/path/to/perl-scripts/ SetHandler perl-script PerlHandler Apache::Registry Options +ExecCGI `Location' refers to the uri, not a directory, think of the above as Any files under that location (which live on your filesystem under /real/path/to/perl-scripts/), will be handled by the Apache::Registry module, which emulates the CGI environment. The file must exist and be executable, in addition, 'Options ExecCGI' must be turned on. If you wish to have mod_perl execute scripts in any location based on file extension, use a configuration like so: SetHandler perl-script PerlHandler Apache::Registry Options ExecCGI Note that `ScriptAlias' does _not_ work for mod_perl. =head1 PORTING CGI SCRIPTS =over 4 =item I/O If you are using Perl 5.004 most CGI scripts can run under mod_perl untouched. If you're using 5.003, Perl's built-in C and C functions do not work as they do under CGI. If you're using CGI.pm, use C<$query-Eprint> instead of plain 'ol C. =item HEADERS By default, mod_perl does not send any headers by itself, however, you may wish to change this: PerlSendHeader On Now the response line and common headers will be sent as they are by mod_cgi. And, just as with mod_cgi, PerlSendHeader will not send a terminating newline, your script must send that itself, e.g.: print "Content-type: text/html\n\n"; If you're using CGI.pm and 'print $q-Eheader' you do _not_ need C. =item NPH SCRIPTS To run a CGI `nph' script under mod_perl, simply add to your code: local $| = 1; If you normally set B, add this to your httpd.conf: PerlSendHeader Off =item PROGRAMMING PRACTICE CGI lets you get away with sloppy programming, mod_perl does not. Why? CGI scripts have the lifetime of a single HTTP request as a separate process. When the request is over, the process goes away and everything is cleaned up for you, e.g. globals variables, open files, etc. Scripts running under mod_perl have a longer lifetime, over several request, different scripts may be in the same process. This means you must clean up after yourself. You've heard: always 'use strict' and C<-w>!!! It's more important under mod_perl Perl than anywhere else, while it's not required, it B recommended, it will save you more time in the long run. And, of course, clean scripts will still run under CGI! =item TRAPS See L. =back =head1 REPORTING PROBLEMS Read the L file. =head1 SEE ALSO Apache::PerlRun(3)