2 Stimmen

Warum wird meine Catalyst-Anwendung nur langsam neu gestartet?

Jedes Mal, wenn ich eine Catalyst-Anwendung erstelle, komme ich an einen Punkt, an dem die Anwendung schmerzhaft langsam (neu) gestartet wird. Die Verzögerung beträgt etwa 10 Sekunden. Heute habe ich herausgefunden, dass die Verzögerung durch die folgenden Zeilen verursacht wird:

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

Diese Zeilen werden nur auf dem Server benötigt, da ich dort keinen Root-Zugang habe und meine Perl-Module unter ~/opt . (Ich kann den Apache nicht verwenden. SetEnv Modul, da der Hoster es nicht unterstützt. Daher muss ich die Bibliothekspfade in App.pm .) Auf meinem Entwicklungsrechner, auf dem die blutige Verzögerung auftritt, gibt es diese Pfade nicht.

Meine Fragen: (1) Warum verursachen die Linien so viel Verzögerung, etwa 7 Sekunden? (2) Wie kann man das Problem lösen? Naive Bedingung use funktioniert nicht:

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

Ich denke, ich könnte eval irgendwie, oder gibt es einen besseren Weg?

9voto

Sinan Ünür Punkte 114993

Ich tue nicht Catalyst Ich bin mir also nicht sicher, ob dies Ihr Problem lösen wird, aber Sie können versuchen, das zu tun, was im Wesentlichen das Gleiche ist lib.pm tut:

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

6voto

Powerlord Punkte 84404

1) Jedes Mal, wenn Sie eine use- oder require-Anweisung haben, werden alle Verzeichnisse der lib der Reihe nach durchsucht. Jede use lib führt (mindestens) zwei stat-Aufrufe durch.

use lib ist nur ein Wrapper, um Dinge auf @LIB zu schieben... aber es sucht auch nach dem Vorhandensein eines arch-Verzeichnisses und schiebt dieses ebenfalls auf @LIB, wenn es existiert.

Sie können die Änderung mit dem Pragma no lib rückgängig machen:

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

Noch besser wäre es, wenn Sie Ihre Entwicklungsumgebung so anpassen, dass sie der Produktionsumgebung entspricht, oder wenn Sie diese Verzeichnisse einfach per Symlink mit den echten Speicherorten für Ihre Entwicklungsumgebung verbinden.

5voto

brian d foy Punkte 124323

Überprüfen Sie "Ein rechtzeitiger Start" von Jean-Louis Leroy am Perl.de . Er beschreibt das gleiche Problem und eine clevere Lösung dafür.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X