mod_perl下的BEGIN/END行为
2008-12-17 11:34
330 查看
这篇文章,对于能看懂的同学是非常非常重要的资料,对于看不懂的同学就一点用处都没有啦。
调查一下mod_perl下BEGIN/INIT/CHECK/END等块的行为如何?
测试程序,保存为life.cgi:
如果直接执行就是这样的:
不论执行多少次,结果都相同(除了每次的pid不同之外)。但如果放到mod_perl下,结果就完全不一样了。先单进程启动(httpd -X),再从浏览器中访问,结果如下:
刷新一次,结果是:
可见,mod_perl下没有INIT和CHECK过程,只有BEGIN和END。其中END在每次请求时必然执行,但BEGIN只有在进程刚创建后的第一次请求时才执行,以后的请求就不执行了。
如果你用了 Apache::Reload,那么可以修改一下life.cgi试试看,哪怕是一点小小的改动也行。修改之后刷新,可以看到BEGIN又回来了,不过再刷一次就没有了。所以Apache::Reload会在重新加载程序后再执行一遍BEGIN。
根据上述结论再引申一下,use = BEGIN { requre + import },可以推断,在同一进程下两次加载执行了use的页面,那么第二次的use是不起作用的。
调查一下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是不起作用的。
相关文章推荐
- perl中的BEGIN和END语句块
- 关于Perl语言中BEGIN和END的使用
- perl语言 两个关键字:BEGIN, END 介绍
- Perl的特殊代码块:BEGIN、CHECK、INIT、END和UNITCHECK
- 关于perl中BEGIN和END的使用
- awk的BEGIN和END
- unbalanced calls to begin/end appearance transitions for uiviewcontroller的解决方法
- 【JSTL】--JSTL表达式:c:forEach,varstatus/begin end/循环控制标签--drp215
- C++中string类下的begin,end,rbegin,rend的用法
- 万物之始与终…你的身体 (From Begin to End for Anything...Your Body) 推荐
- awk语言中BEGIN和END的作用
- begin&end
- list(链表)常用成员(顺序容器)----插入push_back,push_front,insert删除pop_back,pop_front,erase,clear遍历begin,end判空emp
- C++STL中vector容器 begin()与end()函数、front()与back()的用法
- __BEGIN__; __END__ - [OPENCV]
- VC中BeginWaitCursor()和EndWaitCursor()函数
- Ruby 入门: BEGIN & END
- DirectX9 Begin/End Scene
- 标准库函数begin和end
- [C#基础]c#中的BeginInvoke和EndEndInvoke