上一篇:[Perl]读取YAML文件 - 下一篇:[Perl]交互调试mod_perl
版权声明:可以任意转载,但转载时必须标明原作者charlee、原始链接http://tech.idv2.com/2008/08/25/begin-end-in-mod_perl/以及本声明。
这篇文章,对于能看懂的同学是非常非常重要的资料,对于看不懂的同学就一点用处都没有啦。
调查一下mod_perl下BEGIN/INIT/CHECK/END等块的行为如何?
测试程序,保存为life.cgi:
#!/usr/bin/perl
print "pid = $$\n";
print "Start main running here\n";
BEGIN { print "BEGIN\n"; }
INIT { print "INIT\n"; }
CHECK { print "CHECK\n"; }
END { print "END\n"; }
如果直接执行就是这样的:
$ ./life.cgi BEGIN CHECK INIT pid = 4610 Start main running here END
不论执行多少次,结果都相同(除了每次的pid不同之外)。但如果放到mod_perl下,结果就完全不一样了。 先单进程启动(httpd -X),再从浏览器中访问,结果如下:
BEGIN pid = 4557 Start main running here END
刷新一次,结果是:
pid = 4557 Start main running here END
可见,mod_perl下没有INIT和CHECK过程,只有BEGIN和END。其中END在每次请求时必然执行, 但BEGIN只有在进程刚创建后的第一次请求时才执行,以后的请求就不执行了。
如果你用了 Apache::Reload,那么可以修改一下life.cgi试试看,哪怕是一点小小的改动也行。 修改之后刷新,可以看到BEGIN又回来了,不过再刷一次就没有了。 所以Apache::Reload会在重新加载程序后再执行一遍BEGIN。
根据上述结论再引申一下,use = BEGIN { requre + import }, 可以推断,在同一进程下两次加载执行了use的页面,那么第二次的use是不起作用的。
2008-08-26 13:02
@smallfish 谢谢你的评论,和你提供的参考资料。非常有价值
2008-08-29 10:07
共同学习,你的perl功力比偶强悍多了,文章写的不错

2008-08-26 11:38
我也是在看了《mod_perl 编程指南》http://home.arcor.de/mailerstar/jeff/mod_perl/04.html#a9
里面的BEGIN部分才知道。楼主写的不错。