mod_perl介绍
这里主要介绍
1,怎样从mod_perl或者mod_perl2升级到mod_perl2.0.3;
2,mod_perl用到的一些常见功能以及优点;
3,mod_perl为什么没有像mod_php那样普及,谈谈自身不足。
1,怎样从mod_perl或者mod_perl2升级到mod_perl2.0.3;
2,mod_perl用到的一些常见功能以及优点;
3,mod_perl为什么没有像mod_php那样普及,谈谈自身不足。
终于从mod_perl升级到最新的版本2.0.3了,这里有几点心得体会给大家分享一下:
服务器节省了从外部加载解释器的时间,加载的模块和代码仅编译一次,以便让 Perl 脚本运行得更快。
设置好httpd.conf后,重启apache,接着就可以写perl脚本了,这时候perl的脚本可以写的非常简单,这里给出一个test.phtml:
可以查看/www/mod_perl/mason的文件可以知道,mason是通过mod_perl告诉apache服务器信息,其实很多Perl模块都可以如此。
......(待续)
- 什么是mod_perl
服务器节省了从外部加载解释器的时间,加载的模块和代码仅编译一次,以便让 Perl 脚本运行得更快。
- 怎样从mod_perl或者mod_perl2升级到mod_perl2.0.3
- 怎么使用mason
PerlModule HTML::Mason::ApacheHandler注意点是设置好全局MasonCompRoot和MasonDataDir变量,网上有部分教程不全或者有mason只支持Apache1.3或者只支持mod_perl1.3的结论,这些都是错误的。
PerlSetVar MasonCompRoot /www/mod_perl
PerlSetVar MasonDataDir /www/mod_perl/mason
alias /mod /www/mod_perl
<Directory /www/mod_perl>
Options Indexes FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
<Files "*.phtml">
SetHandler perl-script
PerlHandler HTML::Mason::ApacheHandler
</Files>
Allow from all
</Directory>
设置好httpd.conf后,重启apache,接着就可以写perl脚本了,这时候perl的脚本可以写的非常简单,这里给出一个test.phtml:
% my $noun = 'World';浏览器上输出:Hello,World!
Hello <% $noun %>!
可以查看/www/mod_perl/mason的文件可以知道,mason是通过mod_perl告诉apache服务器信息,其实很多Perl模块都可以如此。
......(待续)

a、应尽量减少使用全局变量的次数,因为全局变量产生后将常驻内存,多个程序使用相同的全局变量时很容易产生一些奇怪的错误。例如:
while(1)
{
$cnt++;
if($cnt == 10)
{
last;
}
}
若全局变量$cnt已经产生且执行这段程序前不为0,则这段程序很可能是一段死循环。
若一定要使用全局变量,为不影响其它程序的正常运行,应使用local修来改全局变量的值。例如:local $| = 1;
b、使用mod_perl时,同一个HTML头信息必须放在一个print中打印。
例如:
print "Content-type: text/html\n";
print "Set-Cookie: ..."; #Set-Cookie的所有内容
而不是
print "Content-type: text/html\n";
print "Set-Cookie: cookietext\;"; #Set-Cookie的一部分内容
print "expires=..."; #Set-Cookie的另一部分内容
c、使用mod_perl时,在函数内访问一个在函数作用域外定义的变量,需要使用参数传递。
例如:
#!/usr/bin/perl -w
use strict;
...
my $q = "Hello";
sayit($q);
sub sayit
{
my($q) = @_;
print $q;
}
而不是
#!/usr/bin/perl -w
use strict;
...
my $q = "Hello";
sayit();
sub sayit
{
print $q;
}
同样,在模块中对全局变量的修改应该在函数内进行,在函数外做的修改只在第一次程序运行时(相对于同一个Apache进程)有效。
d、如果安装了Apache::DBI模块并且配置apache使其启动时加载Apache::DBI模块。原来使用的DBI模块的程序在mod_perl环境下实际上是在使用Apache::DBI模块,但对于程序员这是完全透明的,程序不用做任何修改。需要注意的是Apache::DBI只有在使用完全相同的联接字符串时才会认为这是相同的数据库联接,直接使用以前缓冲的数据库联接句柄而不是建立新的数据库联接。为了充分利用Apache::DBI的缓冲机制,提高程序运行效率,所有的数据库联接都应使用相同的联接字符串,如下:
$dbh = DBI->connect("DBI:mysql:mydb1", "root", "helloweb");
e、在将未被解析的Perl脚本的标题头转换为基于mod_perl的脚本时,必须在每次写入或输出到输出文件句柄后强迫将输出清空。这可以如下将 $| 变量设置为非零值来实现:local $| = 1;
f、判断程序是否运行在mod_perl环境下可以采用以下方法:
if(exists $ENV{MOD_PERL})
{
print "Running as a mod_perl application";
}
else
{
print "Running as a CGI script";
}
g、如果修改了Perl库或者修改了通过使用use或require指令加入到脚本中的模块,mod_perl不能自动进行库或模块的重新加载。在这种情况下,需要重新启动Apache。
由于mod_perl每次修改模块都需要重新启动Apache,所以mod_perl的应用非常少,一般只有独立主机才能够用上。