package PLP::Backend::Apache; use strict; use warnings; our $VERSION = '1.00'; use PLP; use constant MP2 => ( defined $ENV{MOD_PERL_API_VERSION} and $ENV{MOD_PERL_API_VERSION} >= 2 ); BEGIN { if (MP2) { require Apache2::Const; require Apache2::RequestRec; require Apache2::RequestUtil; require Apache2::RequestIO; Apache2::Const->import(-compile => qw( HTTP_NOT_FOUND HTTP_FORBIDDEN OK )); } else { require Apache::Constants; } } our $r; # mod_perl initializer: returns 0 on success, Apache error code on failure sub init { $r = shift; $PLP::print = 'PLP::Backend::Apache::print'; $PLP::read = \&read; $ENV{PLP_FILENAME} = my $filename = $r->filename; unless (-f $filename) { return MP2 ? Apache2::Const::HTTP_NOT_FOUND() : Apache::Constants::NOT_FOUND(); } unless (-r _) { return MP2 ? Apache2::Const::HTTP_FORBIDDEN() : Apache::Constants::FORBIDDEN(); } $ENV{PLP_NAME} = $r->uri; $PLP::use_cache = $r->dir_config('PLPcache') !~ /^off$/i; #S $PLP::use_safe = $r->dir_config('PLPsafe') =~ /^on$/i; my $path = $r->filename(); my ($file, $dir) = File::Basename::fileparse($path); chdir $dir; $PLP::code = PLP::source($file, 0, undef, $path); return 0; # OK } sub read ($) { my ($bytes) = @_; $r->read(my $data, $bytes); return $data; } # FAST printing under mod_perl sub print { return unless grep length, @_; PLP::sendheaders() unless $PLP::sentheaders; $r->print(@_); } # This is the mod_perl handler. sub handler { PLP::clean(); $PLP::interface = __PACKAGE__; if (my $ret = init($_[0])) { return $ret; } #S PLP::start($_[0]); PLP::start(); no strict 'subs'; return MP2 ? Apache2::Const::OK() : Apache::Constants::OK(); } 1; =head1 NAME PLP::Backend::Apache - Apache mod_perl interface for PLP =head1 SYNOPSIS Naturally, you'll need to enable I: apache-modconf apache enable mod_perl Setup F (in new installs just create F) with: SetHandler perl-script PerlHandler PLP::Backend::Apache PerlSendHeader On =head1 DESCRIPTION =head2 Configuration directives PLP behaviour can be configured by B rules. These can be added to a F<.htaccess> file or most any scope of server configuration. For example, to disable caching for a specific site: PerlSetVar PLPcache Off =over 16 =item PLPcache Sets caching B/B. When caching, PLP saves your script in memory and doesn't re-read and re-parse it if it hasn't changed. PLP will use more memory, but will also run 50% faster. B is default, anything that isn't =~ /^off$/i is considered On. =back =head1 BUGS With mod_perlB<2>, any new request will change the cwd for all processes. This means that if you're running files from multiple directories, you I for it may change at any time. The bug has been confirmed with at least mod_perl 2.0.2/3/4 on Apache 2.2.3/8. Using this backend on Apache2 is extremely discouraged until this is fixed. Instead, L is recommended. Apache1 does not show any problems. =head1 AUTHOR Mischa POSLAWSKY =head1 SEE ALSO L, L, L