[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