【问题标题】:Why is my Catalyst application slow to restart?为什么我的 Catalyst 应用程序重启很慢?
【发布时间】:2012-04-02 11:09:48
【问题描述】:

每次我构建 Catalyst 应用程序时,都会遇到应用程序启动(重新)缓慢到令人痛苦的地步,延迟大约为 10 秒。今天我认为延迟是由以下几行引起的:

use lib '/home/zoul/opt/lib/perl/5.8';
use lib '/home/zoul/opt/share/perl/5.8';
use lib '/home/zoul/opt/lib/perl/5.8.8';
use lib '/home/zoul/opt/share/perl/5.8.8';

这些行只在服务器上需要,因为我没有在那里获得 root 访问权限并且我的 Perl 模块安装在 ~/opt 下。 (我不能使用 Apache 的 SetEnv 模块,因为主机不支持它。因此我必须将库路径输入到 App.pm。)在我的开发机器上,出现血腥延迟的路径不存在。

我的问题:(1)为什么这些线路会造成如此多的延迟,大约 7 秒? (2) 有什么好的方法来解决这个问题?天真的条件use 不起作用:

if ($on_the_hosting_machine)
{
    use lib '…';
}

我想我可以以某种方式eval,或者有更好的方法吗?

【问题讨论】:

    标签: perl catalyst


    【解决方案1】:

    我不做Catalyst,所以我不确定这是否能解决您的问题,但您可以尝试做基本上是lib.pm 所做的事情:

    BEGIN { 
        if ( $on_the_hosting_machine ) {
            unshift @INC, qw'
                /home/zoul/opt/lib/perl/5.8
                /home/zoul/opt/share/perl/5.8
                /home/zoul/opt/lib/perl/5.8.8
                /home/zoul/opt/share/perl/5.8.8
            ';
        }
    };
    

    【讨论】:

    • 您还可以使用 PERL5LIB 环境变量设置库。
    • 是的,但我认为我在应用程序启动之前无法访问环境。 (这就是我一直在写的关于 Apache 的 SetEnv 的内容,它可以让我事先设置环境。)
    【解决方案2】:

    1) 每次有 use 或 require 语句时,它都会按顺序搜索 lib 中的所有目录。每个使用库都会(至少)进行两次统计调用。

    use lib 只是将内容推送到@LIB 的包装器......但它也会搜索arch 目录的存在并将其推送到@LIB(如果存在)。

    您可以使用 no lib pragma 撤销更改:

    no lib ('/home/zoul/opt/lib/perl/5.8', '/home/zoul/opt/share/perl/5.8', '/home/zoul/opt/lib/perl/5.8.8', '/home/zoul/opt/share/perl/5.8.8');
    

    更好的是,您可以修改您的开发环境以匹配生产,甚至只是将这些目录符号链接到您的开发设置的真实位置。

    【讨论】:

      【解决方案3】:

      Perl.com 上查看 Jean-Louis Leroy 的 "A Timely Start"。他描述了同样的问题和一个巧妙的解决方案。

      【讨论】:

      猜你喜欢
      • 2017-09-22
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2013-07-26
      • 2022-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多