The Apache/Perl integration project brings together the full power of
the Perl programming language and the Apache HTTP server.  This is
achieved by linking the Perl runtime library into the server and
providing an object oriented Perl interface to the server's C language
API. 
These pieces are seamlessly glued together by the `mod_perl' server
plugin, making it is possible to write Apache modules entirely in
Perl.  In addition, the persistent interpreter embedded in the server
avoids the overhead of starting an external interpreter program and
the additional Perl start-up (compile) time. 

Without question, the most popular Apache/Perl module is
Apache::Registry module.  This module emulates the CGI environment,
allowing programmers to write scripts that run under CGI or
mod_perl without change.  Existing CGI scripts may require some
changes, simply because a CGI script has a very short lifetime of one
HTTP request, allowing you to get away with "quick and dirty"
scripting.  Using mod_perl and Apache::Registry requires you to be
more careful, but it also gives new meaning to the work "quick"!
Apache::Registry maintains a cache of compiled scripts, which happens
the first time a script is accessed by a child server or once again if
the file is updated on disk.

Although it may be all you need, a speedy CGI replacement is only a
small part of this project.  Callback hooks are in place for each stage
of a request.  Apache-Perl modules may step in during the handler,
header parser, uri translate, authentication, authorization, access,
type check, fixup, logger and cleanup stages of a request.     

Apache/Perl modules include:
    Apache::Registry       - Run unaltered CGI scripts 
    Apache::Status         - Embedded interpreter runtime status	
    Apache::Embperl        - Embed Perl code in HTML documents
    Apache::SSI            - Implement server-side includes in Perl
    Apache::DBI            - Maintain persistent DBI connections
    Apache::Gateway	   - Implement an HTTP/1.1 gateway
    Apache::GzipChain	   - Compress output on the fly
    Apache::Filter	   - Filter document and script output
    Apache::Sandwich	   - Generate page headers and footers
    Apache::TransLDAP	   - Translate URIs via LDAP lookups
    Apache::ASP		   - Implement "Active Server Pages"
    Apache::AuthenDBI	   - Authenticate against a database via DBI  
    Apache::PHLogin	   - Authenticate against a PH database
    Apache::DBILogger	   - Log requests to a database via DBI
    Apache::Session	   - Persistent session management
    Apache::Throttle	   - Content negotiation based on connection speed
    
There's plenty more Apache/Perl software you might be interested in. 
The Apache/Perl module list keeps track of modules inside and outside
the distribution, along with idea placeholders.  

It is also possible to use Perl to configure your server (in
*.conf files) with <Perl> sections.  This eases often complicated and
cumbersome configuration of vitrual host and various resources.  Since
any Perl code can be used in these sections, configuration info could
be pulled in from an RDBMS with DBI or your favorite database package.

While the output of mod_perl scripts can be included with Server Side
Includes just as CGI scripts can, mod_perl's integration with
mod_include gives an extra speed boost and allows Perl code to be
directly inside SSI files. 

For comments, questions, bug-reports, etc., join the Apache/Perl
mailing list by sending mail to modperl-subscribe@perl.apache.org.
sending mail to announce-subscribe@perl.apache.org
will subscribe you to the very low-traffic announcements list.

Here is an important list of links to follow:

The Apache/Perl homepage:
http://perl.apache.org/ 
 or
http://apache.perl.org/

Mailing list archives:
http://perl.apache.org/maillist/modperl.html#Searchable_Archives

Documentation:
http://perl.apache.org/docs/index.html

Books:

  "Practical mod_perl"
  By Stas Bekman and Eric Cholet
  http://www.modperlbook.org/

  "The mod_perl Developer's Cookbook"
  By Geoffrey Young; Paul Lindner; Randy Kobes
  http://www.modperlcookbook.org/

  "mod_perl quick reference card"
  By Andrew Ford
  http://www.refcards.com/

  "Writing Apache Modules with Perl and C":
  By Lincoln Stein and Doug MacEachern
  http://www.modperl.com/

The Apache/Perl module list:
http://perl.apache.org/products/apache-modules.html



Enjoy,
-Doug MacEachern (dougm@perl.apache.org)

