每次构建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
以某种方式,还是有更好的方式?
答案 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。他描述了同样的问题并巧妙地解决了这个问题。