shi*_*sta 1 apache perl cgi mod-perl
我的apache服务器以前使用的是用perl编写的CGI脚本.我听说使用mod_perl要比使用标准的cgi脚本快得多,所以我在服务器上设置了mod_perl.根据这个页面,为了让我的CGI脚本在mod_perl下运行,我需要做的就是编辑我的httpd.conf文件.我在httpd的末尾添加了以下行:
LoadModule perl_module libexec/apache2/mod_perl.so
<Location /cgi-bin>
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
Options ExecCGI
PerlSendHeader On
Order allow,deny
Allow from all
</Location>
Run Code Online (Sandbox Code Playgroud)
如果我检查
exists $ENV{"MOD_PERL"}在CGI文件中,MOD_PERL变量似乎存在.所以我很确定我已经设置并运行了mod_perl.
我的问题是:我的完全未改变的 CGI脚本是否真的经历了加速?有什么办法可以加快速度吗?或者,任何进一步的工作对于加速都不值得吗?有没有人有这种东西的经验?
我一直在寻找文档和论坛的答案,但我真的找不到任何东西.在此先感谢您的帮助!
是的,一个完全未改变的CGI脚本将使用mod_erl经历加速,使用ModPerl :: Registry处理程序,只要一切都配置正确,并且看起来它就在你的情况下.
它更快的原因是,现在,Apache将使用内置的Perl解释器执行脚本,而不是为每个请求启动新的解释器.此外,您的脚本被缓存并保存在内存中,因此Perl不必重新编译它们,重新加载您所有的模块use等.您甚至可以在启动时使用ModPerl :: RegistryLoader加载它们,以便它们已经被缓存并且第一个访问者点击您的页面时准备好了.
你怎么能让它们更快?人们可以写一本关于这个主题的书.您可以从将代码移动到模块而不是脚本开始.可以使用本机mod_perl API,但我建议使用支持多种体系结构的框架(其中大多数支持所有:mod_perl,psgi/Plack和FastCGI).
注意,ModPerl :: Registry的一个主要缺陷是您不能在子例程中关闭文件范围的my变量.它将导致变量被缓存.(打开warnings,如果发生这种情况,您将看到"$ x不会保持共享"警告.您可以将它们作为参数传递给sub,或者将它们更改为our变量.)