[Vienna-pm] mod_perl und module-preload

Thomas Klausner domm at cpan.org
Wed Sep 19 13:09:17 PDT 2007


Hi!

On Wed, Sep 19, 2007 at 12:03:55PM +0200, peter pilsl wrote:
 
> Ich benutze apache2 und mod_perl f?r eine webplattform.

Lobenswert :-)

> F?r diese Plattform gibts auch eine entwicklungsumgebung zum testen, die nicht
> unter mod_perl l?uft und mittels dem lib-befehl auf einen eigenen modul-ordner

Was ich nicht verstehe - und was auch Patrik angesprochen hat, ist, ob 
beide Versionen (prod & dev) im selben Apache-Prozess laufen. Wenn ja, 
wie kann dann eine als mod_perl, die andere nicht installiert werden? 

> warum greift www.sandbox.at, dass definitiv nicht unter mod_perl lauft, auf ein
> module zur?ck das im speicher gehalten wird. Ich versteh da scheinbar einige
> basics von mod_perl und perl-internas ?berhaupt nicht.

Hm, ich hab noch nie eine Mischung aus mod_perl und CGI in einem 
Apache-Prozess ausprobiert. Aber anscheinend funktioniert das 
Pre-Loading auch fuer's CGI. Du kannst ja mal testweise sowas in das 
faelschlich vorgeladene Modul reingeben:

BEGIN {
    print STDERR "now loading " . __PACKAGE__ ."\n";
    use Data::Dumper;
    print STDERR Dumper(\%INC);
    # oder print STDERR "from file: ." $INC{'Your/Module.pm'}."\n"
    # dann musst du halt Your::Module in den pfadnamen umwandeln
}

Das sollte dann ausgeben, von wo das Module geladen wird. Theoretisch 
solltest du beim Apache Start einen (oder zwei...) eintraege im errorlog 
haben.

Und wenn dann ein CGI-Request reinkommt, und die Zeilen NICHT 
auftauchen, weisst du, dass das Modul nicht nochmal geladen wurde...

> Und gibts einen workaround f?r mein problem? ich k?nnte die entwicklungsmodule
> nat?rlich umbenennen, was aber jede migration einer entwicklungsversion nach
> vorne erheblich aufw?ndiger machen w?rde. Und ein eigener apache f?r die
> entwicklungsversion w?rde den rechner unn?tig belasten, weil die applikation
> recht speicherintensiv ist.

Ich glaube nicht, dass du drumrumkommen wirst, die entwicklungsversion 
auf einem eigenen Apache unter einem anderen Port laufen zu lassen. Wenn 
du da kein mod_perl verwendest, und den Apache entsprechend 
Konfigurierst (wenig Kinder, etc), sollte das nicht allzuviel Speicher 
fressen.

Ein Hack ist mir noch eingefallen (habs aber nicht getestet..):

package Your::Module;

# irgendwo, wo es im CGI-Mode aufgerufen wird:

if ($ENV{MOD_PERL}) {
    delete $INC{'Your/Module.pm'};
    require Your::Module;
}

D.h. zuerst loescht du dein Modul (oder deine Module) aus %INC, und wenn 
du sie dann mit require (nicht mit use!! (weil das wuerde zur compile 
time passieren, nicht zur runtime)) anforderst, scheinen sie nicht im 
%INC auf und werden nochmal geladen (dann hoffentlich von der richtigen 
Stelle)

Wenn dein Modul "komische Sachen" macht, koennte das aber nicht 
klappen...

Viel Glueck!

-- 
#!/usr/bin/perl                              http://domm.plix.at
for(ref bless{},just'another'perl'hacker){s-:+-$"-g&&print$_.$/}


More information about the Vienna-pm mailing list