2009-08-18 4 views
2

私はCatalystアプリケーションをビルドするたびに、アプリケーションが苦労して(再)開始するまでに時間がかかります。遅延は約10秒です。今日、私は遅延は以下の行によって引き起こされる考え出し:Catalystアプリケーションの再起動が遅いのはなぜですか?

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モジュールを使用することができません。なぜなら、hosterはそれをサポートしていないからです。したがって、私はApp.pmにライブラリパスを入力する必要があります。

私の質問:(1)回線がなぜ7秒ほど遅れるのですか? (2)これを解決する良い方法は何ですか?条件付きナイーブuseは動作しません:

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

を私は何とかevalをことができると思います、またはより良い方法はありますか?

答えて

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 
     '; 
    } 
}; 
+0

はい、これはうまくいきます、ありがとうございます。 – zoul

+2

また、PERL5LIB環境変数を使用してライブラリを設定することもできます。 – jrockway

+1

はい、アプリケーション起動前に環境にアクセスできないと思います。 (それは私がApacheのSetEnvについて書いているので、事前に環境を設定することができました) – zoul

6

1 useまたはrequireステートメントを実行すると、libのすべてのディレクトリを順番に検索します。それぞれのuse libは(少なくとも)2つのstat呼び出しを行います。

使用libにはちょうど@LIBに物事をプッシュするためのラッパーです...が、それはまた、アーチディレクトリの存在を検索し、それが存在する場合には、上あまりにも、@LIBしてプッシュします。

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

いっそのこと、あなたが生産に合わせてのdevの環境を変更することができ、あるいは単にあなたのdevのセットアップのための本当の場所にそれらのディレクトリをシンボリックリンク:

あなたは何のlibプラグマを使用していない変更を逆にすることができます。

5

チェックアウト"A Timely Start"ジャン=ルイ・ルロワによってPerl.comに。彼は同じ問題とそのための賢明な修正について説明します。

+2

Perl.comがコミュニティに引き継がれているので、その記事へのリンクは機能しません。これは、http://www.perl.com/pub/2005/12/21/a_timely_start.html(読む価値がある)として入手可能です。 – alexm

関連する問題