2

每次我构建一个 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以某种方式,还是有更好的方法?

4

3 回答 3

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
        ';
    }
};
于 2009-08-18T17:09:47.583 回答
6

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

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

于 2009-08-18T17:29:57.183 回答
5

在Perl.com上查看Jean-Louis Leroy 的“及时开始”。他描述了同样的问题和一个聪明的解决方法。

于 2009-08-21T15:13:31.853 回答