使用mod_perl,我的未更改的CGI脚本实际上更快吗?

时间:2012-06-12 23:44:18

标签: perl apache cgi mod-perl

我的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脚本实际上是否经历了加速?有什么办法可以加快速度吗?或者,任何进一步的工作对于加速都不值得吗?有没有人有这类东西的经验?

我一直在搜索文档和论坛以获得答案,但我找不到任何东西。在此先感谢您的帮助!

3 个答案:

答案 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

的程序优化的更多阅读