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

zou*_*oul 2 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';
Run Code Online (Sandbox Code Playgroud)

这些行只在服务器上需要,因为我没有root权限并且安装了我的Perl模块~/opt.(我不能使用Apache的SetEnv模块,因为主机不支持它.因此我必须进入库路径App.pm.)在我的开发机器上展示了血腥延迟,路径不存在.

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

if ($on_the_hosting_machine)
{
    use lib '…';
}
Run Code Online (Sandbox Code Playgroud)

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

Sin*_*nür 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
        ';
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用PERL5LIB环境变量设置库. (2认同)

Pow*_*ord 6

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

使用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');
Run Code Online (Sandbox Code Playgroud)

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


bri*_*foy 5

看看"适时启动"由让-路易·勒鲁瓦Perl.com.他描述了同样的问题,并巧妙地解决了这个问题.

  • 由于Perl.com被社区接管,因此该文章的链接不起作用.现在它可以http://www.perl.com/pub/2005/12/21/a_timely_start.html(值得一读). (2认同)