Category: mod_perl Keywords: mod_perl configuring
第一句见的最多的可能是 PerlModulePerlModule
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 ...>就禁止使用 PerlAuthenHandler, PerlAuthzHandler, PerlAccessHandler, 和
PerlOptions -Authen -Authz -Access -Sections
</VirtualHost>
<VirtualHost ...>就只能使用 PerlResponseHandler
PerlOptions None +Response
</VirtualHost>
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-scriptperl-script
这是更为常见的类型的。它的默认配置为:- 如果没有 PerlOptions -GlobalRequest 的话,PerlOptions +GlobalRequest 将在 PerlResponseHandler 阶段起作用。
- 如果没有 PerlOptions -SetupEnv 的话,默认将是 PerlOptions +SetupEnv
- 将 STDIN 和 STDOUT 与 $r 绑定,这样就能使用 CORE::print() 来输出到 STDOUT 或从 STDIN 中读取。而 modperl 类型必须使用 $r->puts() 这样的函数来输出。
- %ENV, @INC, $/, STDOUT 的 $| 和 END 块这种特殊变量将在调用 response handler 之前保存而在之后将恢复。
- 任何加到 %ENV 的变量将传递给 subprocess_env 表,而后我们可以在接下来的 PerlLogHandler 和 PerlCleanupHandler 阶段中通过 r->subprocess_env 来获取。
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接下来在 Apache2::VarTest::handler() 里你可以通过
<Location /print_env2>
SetHandler modperl
PerlResponseHandler Apache2::VarTest
PerlSetVar VarTest VarTestValue
</Location>
$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>
- 不同点:
- perl-script 可以用 print, 而 modperl 只能用 $r->print
- perl-script 默认就用 PerlOptions +SetupEnv, 而 modperl 下一定要显性调用 $r->subprocess_env; 或开启 PerlOptions +SetupEnv
PerlResponseHandler
这个阶段是用于创建回复的。这毫无疑问是 mod_perl 中最最重要的阶段。而且这个指令是 mod_perl 中必须的两个指令之一。
<Location /hello>哪个指令都能少,就这两个是必须的。它指出了在 ResponseHandler 阶段所委托的模块。
SetHandler perl-script
PerlResponseHandler Apache2::Hello
</Location>