1

我的 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>

如果我检查

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

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

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

4

3 回答 3

5

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

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

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

注意,ModPerl::Registry的一个主要缺陷是您不能在子例程中关闭文件范围的my变量。它将导致变量被缓存。(打开warnings,如果发生这种情况,您将看到“$x 将不会保持共享”警告。您可以将它们作为参数传递给 sub,或者将它们更改为our变量。)

于 2012-06-13T07:15:01.840 回答
3

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

于 2012-06-13T01:55:49.030 回答
2

您的问题在类似的问题中得到了部分回答: CGI 在与不需要 VM 的已编译程序一起使用时是否仍然很慢?

链接的答案及其阅读材料讨论了 CGI 和 FastCGI 或其他技术(如 mod_perl eg)之间的差异。

解释和扩展答案:
您可能会看到加速,但它可能是微不足道的。这在很大程度上取决于您的程序的工作量。具有大量请求的轻型工作负载可能会看到最大的性能改进。

在考虑进一步优化时,首先问问自己是否需要。在http://en.wikipedia.org/wiki/Program_optimization有更多关于程序优化的阅读

于 2012-06-13T00:10:48.207 回答