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 は (少なくとも) 2 つの stat 呼び出しを行います。

use lib は、@LIB に何かをプッシュするためのラッパーにすぎませんが、arch ディレクトリの存在も検索し、存在する場合はそれを @LIB にプッシュします。

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

さらに良いことに、開発環境を本番環境に合わせて変更したり、それらのディレクトリを開発セットアップの実際の場所にシンボリック リンクしたりすることもできます。

于 2009-08-18T17:29:57.183 に答える
5

Perl.comの Jean-Louis Leroy による"A Timely Start"をチェックしてください。彼は、同じ問題とそれに対する巧妙な修正について説明しています。

于 2009-08-21T15:13:31.853 に答える