我的apache服务器以前使用的是用perl编写的CGI脚本。我听说使用mod_perl要比使用标准的cgi脚本快得多,所以我在服务器上设置了mod_perl。根据{{3}},为了让我的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>
如果我在CGI文件中检查
exists $ENV{"MOD_PERL"},则MOD_PERL变量似乎存在。所以我很确定我已经设置并运行了mod_perl。
我的问题是:我的完全不变的 CGI脚本实际上是否经历了加速?有什么办法可以加快速度吗?或者,任何进一步的工作对于加速都不值得吗?有没有人有这类东西的经验?
我一直在搜索文档和论坛以获得答案,但我找不到任何东西。在此先感谢您的帮助!
答案 0 :(得分:5)
是的,一个完全未改变的CGI脚本将使用mod_perl经历加速,使用ModPerl :: Registry处理程序,只要一切都配置正确,并且看起来它就在你的情况下。
它更快的原因是,现在,Apache将使用内置的Perl解释器执行脚本,而不是为每个请求启动新的解释器。此外,您的脚本被缓存并保存在内存中,因此Perl不必重新编译它们,重新加载您use
d等所有模块。您甚至可以在启动时使用ModPerl :: RegistryLoader加载它们,以便当第一位访问者访问您的网页时,它们已经被缓存并准备好了。
你怎么能让它们更快?人们可以写一本关于这个主题的书。您可以从将代码移动到模块而不是脚本开始。可以使用本机mod_perl API,但我建议使用支持多种体系结构的框架(大多数支持所有体系结构:mod_perl,psgi / Plack和FastCGI)。
注意,major pitfall with ModPerl::Registry是您不能close over子例程中的文件范围my
变量。它将导致变量被缓存。 (打开warnings
,如果发生这种情况,您会看到“$ x不会保持共享”警告。您可以将传递给子作为参数,或者将其更改为our
变量。)
答案 1 :(得分:3)
您不必再次加载perl
。您加载的任何模块都不必第二次加载。脚本本身只编译一次。肯定有节省。
答案 2 :(得分:2)
您的问题在类似的问题中得到了部分回答: Is CGI still slow when used with a compiled program that doesn't require a VM?
链接的答案及其阅读材料讨论了CGI和FastCGI或其他技术(例如mod_perl)之间的差异。
解释并扩展答案:
你可能会看到加速,但它可能是一个可以忽略不计的数量。它在很大程度上取决于您的程序的工作量。拥有大量请求的轻量级工作负载可能会带来最大的性能提升。
在考虑进一步优化时,首先要问问自己是否需要。关于http://en.wikipedia.org/wiki/Program_optimization
的程序优化的更多阅读