stas 02/05/28 22:24:44
Modified: src/docs/1.0/guide Changes.pod intro.pod
Log:
o major additions to the introduction, including information about
the C API and the Perl API and Apache::PerlRun, as well as some
more corrections of links relative to the site. [Per Einar]
Submitted by: per einar
Revision Changes Path
1.27 +8 -2 modperl-docs/src/docs/1.0/guide/Changes.pod
Index: Changes.pod
===================================================================
RCS file: /home/cvs/modperl-docs/src/docs/1.0/guide/Changes.pod,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- Changes.pod 29 May 2002 05:13:57 -0000 1.26
+++ Changes.pod 29 May 2002 05:24:43 -0000 1.27
@@ -68,8 +68,8 @@
o show an example on how to load the mod_perl related config only
when mod_perl is loaded (Rafael Garcia-Suarez)
- o More information about PerlSetEnv/PerlPassEnv w/ practical example
- [Per Einar]
+ o More information about PerlSetEnv/PerlPassEnv/PerlSetupEnv w/
+ practical example [Per Einar]
o Extend on PerlSetVar/PerlAddVar but more importantly, add
information about subrequests w/ lookup_file and dir_config
@@ -108,6 +108,12 @@
o added a new section: "Potential Drawbacks of Memory Sharing
Restriction"
+
+* intro
+
+ o major additions to the introduction, including information about
+ the C API and the Perl API and Apache::PerlRun, as well as some
+ more corrections of links relative to the site. [Per Einar]
* guide
1.15 +204 -39 modperl-docs/src/docs/1.0/guide/intro.pod
Index: intro.pod
===================================================================
RCS file: /home/cvs/modperl-docs/src/docs/1.0/guide/intro.pod,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- intro.pod 19 May 2002 10:43:29 -0000 1.14
+++ intro.pod 29 May 2002 05:24:43 -0000 1.15
@@ -1,15 +1,15 @@
=head1 NAME
-Introduction. Incentives.
+Introduction and Incentives
=head1 Description
An introduction to what mod_perl is all about, its different features,
-and some explanations of C<Apache::Registry>, C<Apache::PerlRun> and
-the Apache/Perl API.
+and some explanations of the C API, C<Apache::Registry>,
+C<Apache::PerlRun> and the Apache/Perl API.
-=head1 What is mod_perl
+=head1 What is mod_perl?
The Apache/Perl integration project brings together the full power of
the Perl programming language and the Apache HTTP server. With
@@ -43,6 +43,9 @@
C<PerlSetVar>, and E<lt>PerlE<gt> sections). You can even define your
own configuration directives.
+For examples on how you use mod_perl, see our L<What is
+mod_perl?|start::index> section.
+
Many people ask "How much of a performance improvement does mod_perl
give?" Well, it all depends on what you are doing with mod_perl and
possibly who you ask. Developers report speed boosts from 200% to
@@ -67,21 +70,165 @@
<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
- Options ExecCGI
+ Options +ExecCGI
PerlSendHeader On
</Location>
=head2 C API
-META: complete
+The Apache C API has been present for a long time, and has been the
+usual way to program extensions to Apache, such as mod_perl. When you
+write C extension modules, you write C code that is not independent,
+but will be linked into the Apache I<httpd> executable either at build
+time (if the module is statically linked), or at runtime (if it is
+compiled as a Dynamic Shared Object, or DSO). Either way, you do as
+with any C library: you write functions that receive a certain number
+of arguments and make use of external API functions, provided by
+Apache or by other libraries.
+
+The difference is that with Apache extension modules, these functions
+are I<registered> inside a module record: you tell Apache already at
+compile-time for which phases you wish to run any functions. Of
+course, you probably won't be handling all the phases. Here is an
+example of a module handling only the content generation phase:
+
+ /* Dispatch list of content handlers */
+ static const handler_rec hello_handlers[] = {
+ { "hello", hello_handler },
+ { NULL, NULL }
+ };
+
+ /* Dispatch list for API hooks */
+ module MODULE_VAR_EXPORT hello_module = {
+ STANDARD_MODULE_STUFF,
+ NULL, /* module initializer */
+ NULL, /* create per-dir config structures */
+ NULL, /* merge per-dir config structures */
+ NULL, /* create per-server config structures */
+ NULL, /* merge per-server config structures */
+ NULL, /* table of config file commands */
+ hello_handlers, /* [#8] MIME-typed-dispatched handlers */
+ NULL, /* [#1] URI to filename translation */
+ NULL, /* [#4] validate user id from request */
+ NULL, /* [#5] check if the user is ok _here_ */
+ NULL, /* [#3] check access by host address */
+ NULL, /* [#6] determine MIME type */
+ NULL, /* [#7] pre-run fixups */
+ NULL, /* [#9] log a transaction */
+ NULL, /* [#2] header parser */
+ NULL, /* child_init */
+ NULL, /* child_exit */
+ NULL /* [#0] post read-request */
+ };
+
+Using this configuration (and a correctly built C<hello_handler()>
+function), you'd then be able to use the following configuration to
+allow your module to handle the requests for the I</hello> URI.
+
+ <Location /hello>
+ SetHandler hello
+ </Location>
+
+When Apache sees a request for the I</hello> URI, it will then figure
+out what the "hello" handler corresponds to by looking it up in the
+handler record, and match that to the C<hello_handler> function
+pointer, which will execute the C<hello_handler> function of your
+module with a C<request_rec *r> as an argument. From that point, your
+handler is free to do whatever it wants, returning content, declining
+the request, or doing other bizarre things based on user input.
+
+It is not the object of this guide to explain how to program C
+handlers. However, this example lets you in on some of the secrets of
+the Apache core, which you will probably understand anyway by using
+mod_perl. If you want more information on writing C modules, you
+should read the Apache API documentation at
+http://httpd.apache.org/docs/misc/API.html and more importantly
+I<Writing Apache Modules with Perl and C>, which will teach you about
+I<both> mod_perl and C modules!
=head2 Perl API
-META: complete
+After a while, C modules were found hard to write and difficult to
+maintain, mostly because code had to be recompiled or just because of
+the low-level nature of the C language, and because these modules were
+so intricately linked with Apache that a small bug could put at risk
+your whole server environment. In comes mod_perl. Programmed in C and
+using all the techniques described above and more, it allows Perl
+modules, written in good Perl style, to access the (almost) complete
+API provided to the conventional C extensions.
+
+However, the structure used for Perl Apache modules is a little
+different. If you've programmed normal Perl modules (like those found
+on CPAN) before, you'll be happy to know that programming for mod_perl
+using the Apache API doesn't involve anything else than writing a Perl
+module that defines a C<handler> subroutine (that is the
+convention--we'll see that that doesn't necessarily have to be the
+name). This subroutine accepts an argument, C<$r>, which is the Perl
+API equivalent of the C API C<request_rec *r>.
+
+C<$r> is your entry point to the whole Perl Apache API. Through it you
+access methods in good object-oriented fashion, which makes it
+slightly easier than with C, and looks a lot more familiar to Perl
+programmers.
+
+Furthermore, Perl Apache modules do not define handler records like C
+modules. You only need to create your handler subroutine(s), and then
+control which requests they should handle solely with mod_perl
+configuration directives inside your Apache configuration.
+
+Let's look at a sample handler that returns a greeting and the current
+local time.
+
+ file:My/Greeting.pm
+ -------------------
+ package My::Greeting;
+ use strict;
+
+ use Apache::Constants qw(OK);
+
+ sub handler {
+ my $r = shift;
+ my $now = scalar localtime;
+ my $server_name = $r->server->server_hostname;
+
+ $r->send_http_header('text/plain');
+
+ print <<EOT;
+ Thanks for visiting $server_name.
+ The local time is $now.
+ EOT
+
+ return OK;
+ }
+ 1; # modules must return true
+
+As you can see, we're mixing Perl standard functions (like
+C<localtime()>) with Apache functions
+(C<$r-E<gt>send_http_header()>). To return the above greeting when
+accessing the I</hello> URI, you would configure Apache like this:
+
+ <Location /hello>
+ SetHandler perl-script
+ PerlHandler My::Greeting
+ </Location>
+
+When it sees this configuration, mod_perl loads the C<My::Greeting>
+module, finds the C<handler()> subroutine, and calls it to allow it to
+return the appropriate content. There are equivalent C<Perl*Handler>
+directives for the different phases we saw were available to C
+handlers.
+
+The Perl API gives you an incredible number of possibilities, which
+you can then use to be more productive or creative. mod_perl is an
+enabling technology; it won't make you smarter or more creative, but
+it will do its best to make you lose less time because of
+I<"accidental difficulties"> of programming, and let you concentrate
+more on the important parts.
+
=head2 Apache::Registry
-From the viewpoint of the Perl API, C<Apache::Registry> is simply
+From the viewpoint of the Perl API, L<Apache::Registry> is simply
another handler that's not conceptually different from any other
handler. C<Apache::Registry> reads in the script file, compiles,
executes it and stores into the cache. Since the perl interpreter
@@ -158,13 +305,34 @@
your code's URI is called, mod_perl will seek to execute the URI's
associated C<handler> subroutine.
-META: Complete
+C<Apache::Registry> is usually configured in this way:
+
+ Alias /perl/ /usr/local/apache/bin/
+ <Location /perl>
+ SetHandler perl-script
+ PerlHandler Apache::Registry
+ </Location>
+
+In short, we see that C<Apache::Registry> is just another mod_perl
+handler, which is executed when requests are made for the I</perl>
+directory, and then does some special handling of the Perl scripts in
+that directory to turn I<them> into Apache handlers.
+
=head2 Apache::PerlRun
-META: Complete
+L<Apache::PerlRun> is very similar to C<Apache::Registry>. It uses the
+same basic concepts, i.e. it runs CGI scripts under mod_perl for
+additional speed. However, unlike C<Apache::Registry>,
+C<Apache::PerlRun> will not cache scripts. The reason for this is that
+it's designed for use with CGI scripts that may have been "dirty",
+which might cause problems when run persistently under mod_perl. Apart
+from that, the configuration is the same. We discuss
+C<Apache::PerlRun> in L<Apache::PerlRun, a closer
+look|guide::porting/Apache__PerlRun__a_closer_look>.
+
-=head1 What will you learn
+=head1 What you will learn
This document was written in an effort to help you start using
Apache's mod_perl extension as quickly and easily as possible. It
@@ -173,12 +341,12 @@
writing and porting existing Perl scripts to run under mod_perl. Note
that it does not attempt to enter the big world of using the Perl API
or C API. You will find pointers to coverage of these topics in the
-L<Getting Help and Further Learning|guide::help/> section of this
-document. This guide tries to cover the most of the
-C<Apache::Registry> and C<Apache::PerlRun> modules. Along with
-mod_perl related topics, there are many more issues related to
-administering Apache servers, debugging scripts, using databases,
-mod_perl related Perl, code snippets and more.
+L<Offsite resources|docs::offsite::index> section of this site. This
+guide tries to cover the most of the C<Apache::Registry> and
+C<Apache::PerlRun> modules. Along with mod_perl related topics, there
+are many more issues related to administering Apache servers,
+debugging scripts, using databases, mod_perl related Perl, code
+snippets and more.
It is assumed that you know at least the basics of building and
installing Perl and Apache. (If you do not, just read the INSTALL
@@ -188,28 +356,25 @@
complete the mod_perl installation and get the server running in a
short time.
-If after reading this guide and the other documents listed in
-L<Getting Help and Further Learning|guide::help/> you feel that your
-questions remain unanswered, you could try asking the apache/mod_perl
-mailing list to help you. But first try to browse the mailing list
-archive (located at http://mathforum.org/epigone/modperl ). Often you
-will find the answer to your question by searching the mailing list
-archive, since most questions have already been asked and answered
-already! If you ignore this advice, do not be surprised if your
-question goes unanswered - it bores people when they're asked to
-answer the same question repeatedly - especially if the answer can be
-found in the archive or in the documentation. This does not mean that
-you should avoid asking questions, just do not abuse the available
-help and B<RTFM> before you call for B<HELP>. (You have certainly
-heard the infamous fable of the shepherd boy and the wolves...) And if
-you do ask questions on the mailing list I<please> make your subject
-line descriptive of the problem, not just "Help" - you're far more
-likely to get replies if people can see the issue you are talking
-about straight away.
-
-If you find incorrect details or mistakes in my grammar, or you want
-to contribute to this document please feel free to send me an email at
[EMAIL PROTECTED] .
+If after reading this guide and the L<other documentation|docs::index>
+you feel that your questions remain unanswered, you could try asking
+the apache/mod_perl mailing list to help you. But first try to browse
+the L<mailing list
+archive|maillist::modperl/Searchable_Archives>. Often you will find
+the answer to your question by searching the mailing list archive,
+since most questions have already been asked and answered already! If
+you ignore this advice, do not be surprised if your question goes
+unanswered - it bores people when they're asked to answer the same
+question repeatedly - especially if the answer can be found in the
+archive or in the documentation. This does not mean that you should
+avoid asking questions, just do not abuse the available help and
+B<RTFM> before you call for B<HELP>. When asking your question, be
+sure to have read the L<email-etiquette|maillist::email-etiquette> and
+L<How to report problems|guide::help>
+
+If you find errors in these documents, please contact the maintainer,
+after having read about L<how to submit documentation
+patches|download::docs/Submitting_documentation_patches>.
=head1 Maintainers
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]