【问题标题】:Are my unaltered CGI scripts actually faster with mod_perl?使用 mod_perl,我未更改的 CGI 脚本实际上更快吗?
【发布时间】:2012-06-15 21:49:36
【问题描述】:

我的 apache 服务器以前使用用 perl 编写的 CGI 脚本。我听说使用 mod_perl 比使用标准 cgi 脚本快得多,所以我开始在我的服务器上设置 mod_perl。根据this page,为了让我的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>

如果我检查

exists $ENV{"MOD_PERL"}
在 CGI 文件中,MOD_PERL 变量似乎存在。所以我很确定我已经设置并运行了 mod_perl。

我的问题是:我的完全没有改变 CGI 脚本实际上 是否经历了加速?我能做些什么来加快速度吗?或者任何进一步的工作是否真的不值得加速?有没有人用过这种类型的东西?

我一直在搜索文档和论坛以寻找答案,但我真的找不到任何东西。提前感谢您的帮助!

【问题讨论】:

  • 通常是启动 Perl 解释器和编译模块导致 CGI 变慢。
  • 如果您愿意修改您的脚本以更符合 mod_perl API,您可以切换到更快的SetHandler modperl

标签: perl apache cgi mod-perl


【解决方案1】:

是的,一个完全未改变的 CGI 脚本将通过 mod_perl 体验加速,使用 ModPerl::Registry 处理程序,只要一切配置正确,并且看起来是您的情况。

它更快的原因是现在,Apache 将使用内置的 Perl 解释器执行脚本,而不是为每个请求启动一个新的解释器。此外,您的脚本被缓存并保存在内存中,因此 Perl 不必重新编译它们,重新加载您 used 的所有模块等。您甚至可以在启动时使用 ModPerl::RegistryLoader 加载它们,这样它们就可以已缓存并准备好在第一个访问者点击您的页面时获取。

如何让它们更快?一个人可以写一本关于这个主题的书。您可以从将代码移动到模块而不是脚本开始。可以使用原生 mod_perl API,但我建议使用支持多种架构的框架(其中大多数都支持:mod_perl、psgi/Plack 和 FastCGI)。

注意,major pitfall with ModPerl::Registry 是您不能在子例程中 close over 文件范围的 my 变量。它将导致变量被缓存。 (打开warnings,如果发生这种情况,您将看到“$x 将不会保持共享”警告。您可以它们作为参数传递给子,或将它们更改为@987654326 @ 变量。)

【讨论】:

    【解决方案2】:

    您不必再次加载 perl 本身。您加载的任何模块都不必第二次加载。脚本本身只编译一次。肯定有节省。

    【讨论】:

      【解决方案3】:

      您的问题在类似问题中得到部分回答: 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 阅读更多关于程序优化的文章

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        • 2017-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多