Journal(2005) | Blog(2006) | RandomLink | WhoAmI | LiveBookmark | HomePage

<<Previous: a schedule of mod_perl learning  >>Next: CPAN RSS updated

mod_perl 配置的一些指令

Category: mod_perl   Keywords: mod_perl configuring

第一句见的最多的可能是 PerlModule

PerlModule

PerlModule Foo::Bar 就等同于 Perl 的 require Foo::Bar;
有点不同的可能是可以接受多个参数:PerlModule Apache::DBI CGI DBD::Mysql
如果你需要传递 qw/foo bar/ 给 Foo::Bar 的话,一般将它写入一个 pl 文件里,然后用 PerlRequire 载入它。如 startup.pl:
use Apache2::Const -compile => ':common';
use APR::Const -compile => ':common';
...

PerlRequire

在 1.0 中在这是常用句,用于载入一个 Perl 文件。由于它不能控制代码的运行时间,所以在 2.0 中被 PerlConfigRequire 和 PerlPostConfigRequire 所细分。
PerlConfigRequire 是碰到该语句立即运行该参数文件,而 PerlPostConfigRequire 是在服务器运行的最后阶段才运行。
一般而言,PerlPostConfigRequire 才是我们所要的。
PerlRequire "C:/Apache2/conf/startup.pl"

PerlOption

提供 mod_perl 的编译选项。
如果在运行时需要确定某些选项是否已经启用,可使用 $r->is_perl_option_enabled($option) 或 $s->is_perl_option_enabled($option) 来判断。
一般允许用 +, 禁止用 -

Enable

一般用于使某虚拟主机能用,而某主机不能使用 mod_perl. 如
<VirtualHost ...>
PerlOptions -Enable
</VirtualHost>

Perl*Handler

可以设置哪些 Perl*Handler 我们能使用而哪些不能使用。如
<VirtualHost ...>
PerlOptions -Authen -Authz -Access -Sections
</VirtualHost>
就禁止使用 PerlAuthenHandler, PerlAuthzHandler, PerlAccessHandler, 和 Sections/段。而
<VirtualHost ...>
PerlOptions None +Response
</VirtualHost>
就只能使用 PerlResponseHandler

AutoLoad

大致是自动加载的意思。比如开启 PerlOptions +Autoload 后,当使用 PerlResponseHandler Apache::Magick 时前面就不需要先明显的加载 PerlModule Apache::Magick 模块。而是碰到后会自动加载。

ParseHeaders

它与 mod_perl 1.0 中的 PerlSendHeader On 功能一样。
如果你在代码中使用 print "Content-type: text/html\n\n"; 的话将这个 PerlOption 开起来。它会将这句话自动转为调用 send_http_header
这一般在 ModPerl::Registry 中用得比较多。因为 ModPerl::Registry 使用的旧代码都是这么输出的。
<Location /perl>
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
Options +ExecCGI
PerlOptions +ParseHeaders
PerlOptions +SetupEnv
</Location>

Others etc.

还有一些其他比较复杂的涉及到编译池或环境变量什么的。如果以后有机会用到再介绍。

PerlSwitches

Switch 的意思是开关。如我们在命令行时会使用 perl -e 这里的 -e 就是一个 switch.
一般而言它最大的用途就是修改 @INC, (我们也可以在 startup.pl 里修改,然后 PerlRequire)用 PerlSwitches 的好处就是黏合力更强一些。如:
PerlSwitches -I/var/www/MyApp/lib
它的作用还类似于这么写:
<Perl>
use lib qw(/var/www/MyApp/lib);
</Perl>
这三种办法都是可以的。

SetHandler

有两种类型,一种是 modperl, 另一种是 perl-script

perl-script

这是更为常见的类型的。它的默认配置为:

modperl

这种类型下你只能调用 Perl*Handler 里的函数。如果你不需要以上 perl-script 的用途的话,使用 modperl 会带来更好的性能。
当配置成 PerlOptions +SetupEnv 时, modperl 类型只配置如下环境变量:$ENV{MOD_PERL}(总是存在) $ENV{PATH} 和 $ENV{TZ} (如果你在命令行/shell 或 httpd.conf 里设置了它们)。这时候你如果想传递一些配置变量的话一定要使用 PerlSetVar 和 PerlAddVar 而不是 PerlSetEnv 和 PerlPassEnv. 举一个例子:
 #httpd.conf
<Location /print_env2>
SetHandler modperl
PerlResponseHandler Apache2::VarTest
PerlSetVar VarTest VarTestValue
</Location>
接下来在 Apache2::VarTest::handler() 里你可以通过
$r->dir_config('VarTest');

例子

file:MyApache2/PrintEnv1.pm
-----------------------
package Apache::PrintEnv1;
use strict;

use Apache::RequestRec ( ); # for $r->content_type
use Apache2::RequestIO (); # for print
use Apache2::Const -compile => ':common';

sub handler {
my $r = shift;

$r->content_type('text/plain');
for (sort keys %ENV){
print "$_ => $ENV{$_}\n";
}

return Apache2::Const::OK;
}
1;

这个需要配置成
PerlModule MyApache2::PrintEnv1
<Location /print_env1>
SetHandler perl-script
PerlResponseHandler MyApache2::PrintEnv1
</Location>
file:MyApache2/PrintEnv2.pm
------------------------
package MyApache2::PrintEnv2;
use strict;

use Apache2::RequestRec (); # for $r->content_type
use Apache2::RequestIO (); # for $r->print

use Apache2::Const -compile => ':common';

sub handler {
my $r = shift;

$r->content_type('text/plain');
$r->subprocess_env;
for (sort keys %ENV){
$r->print("$_ => $ENV{$_}\n");
}

return Apache2::Const::OK;
}
1;
这个可以配置成
PerlModule MyApache2::PrintEnv2
<Location /print_env2>
SetHandler modperl
PerlResponseHandler MyApache2::PrintEnv2
</Location>

PerlResponseHandler

这个阶段是用于创建回复的。这毫无疑问是 mod_perl 中最最重要的阶段。
而且这个指令是 mod_perl 中必须的两个指令之一。
<Location /hello>
SetHandler perl-script
PerlResponseHandler Apache2::Hello
</Location>
哪个指令都能少,就这两个是必须的。它指出了在 ResponseHandler 阶段所委托的模块。

Reference

* http://perl.apache.org/docs/2.0/user/config/config.html

<<Previous: a schedule of mod_perl learning  >>Next: CPAN RSS updated

Options: +Del.icio.us

Related items Created on 2005-11-13 11:38:05, Last modified on 2005-11-23 23:00:46
Copyright 2004-2005 All Rights Reserved. Powered by Eplanet && Catalyst 5.62.