每次我构建一个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以某种方式,还是有更好的方法?
我不这样做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)
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)
更好的是,您可以修改您的开发环境以匹配生产,甚至只需将这些目录符号链接到您的开发设置的实际位置.