为什么我的Catalyst应用程序重启速度慢?

时间:2009-08-18 17:02:31

标签: perl catalyst

每次构建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权限,并在~/opt下安装了我的Perl模块。 (我不能使用Apache的SetEnv模块,因为主机不支持它。因此我必须将库路径输入App.pm。)在我的开发机器上展示了路径的延迟不存在。

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

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

我想我可以eval以某种方式,还是有更好的方式?

3 个答案:

答案 0 :(得分:9)

我没有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
        ';
    }
};

答案 1 :(得分:6)

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

使用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');

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

答案 2 :(得分:5)

Jean-Louis Leroy在"A Timely Start"上查看Perl.com。他描述了同样的问题并巧妙地解决了这个问题。