Apache soll Module aktualisieren
Johnny
- webserver
Hallo liebe Community,
ich hab mich schon waffelig gesucht, aber keine Lösung finden können:
Für meine lokale Testumgebung habe ich XAMPP aufgesetzt, läuft auch alles soweit prima.
Ich habe ein Perl-Programm, welches selbstgeschriebene Module via "use Routines.pm" einbindet. Auch das klappt.
Allerdings lädt Apache dieses Modul nur ein Mal, danach wird es irgendwo zwischengespeichert und beim erneuten Ansprechen aus diesem Zwischenspeicher geladen - jedenfalls bewirken Änderungen in der Datei "Routines.pm" nichts.
Wenn ich Apache stoppe und dann neu starte, lädt er wieder die aktuelle Version des Moduls. Das ist aber natürlich zum Testen der Scripte nicht komfortabel: Apache sollte das Modul bei jedem Aufruf neu laden, damit meine Änderungen sofort sichtbar sind.
Nun habe ich schon viel gesucht, was ich in der Konfiguration ändern muß, damit dies so geschieht - leider ohne Erfolg.
Ich suche also sowas wie beim Internet-Explorer "Bei jedem Zugriff auf die Seite neu laden".
Is there anybody out there?!??
Muchas Gracias
Johnny
hallo,
Allerdings lädt Apache dieses Modul nur ein Mal, danach wird es irgendwo zwischengespeichert und beim erneuten Ansprechen aus diesem Zwischenspeicher geladen
Das ist eine relativ genaue Beobachtung. Allerdings ist nicht Apache die Software, die da etwas zwischenspeichert, sondern Perl ist es.
Wenn ich Apache stoppe und dann neu starte, lädt er wieder die aktuelle Version des Moduls. Das ist aber natürlich zum Testen der Scripte nicht komfortabel: Apache sollte das Modul bei jedem Aufruf neu laden, damit meine Änderungen sofort sichtbar sind.
Das ist zuviel verlangt von Apache.
Ich suche also sowas wie beim Internet-Explorer "Bei jedem Zugriff auf die Seite neu laden".
Von der Browserseite aus kannst du es so versuchen, daß du nach jeder Änderung am Perl-Modul den Browsercache leerst und/oder den Browser neu startest. Wesentlich andere Mechanismen sind mir nicht bekannt.
Grüße aus Berlin
Christoph S.
Moin!
Von der Browserseite aus kannst du es so versuchen, daß du nach jeder Änderung am Perl-Modul den Browsercache leerst und/oder den Browser neu startest. Wesentlich andere Mechanismen sind mir nicht bekannt.
Wenn du weiter oben diagnostizierst, dass Perl verantwortlich ist für das einmalige "Kompilieren/Einlesen/Abspeichern/Wasauchimmer" des fraglichen Moduls - wie kommst du dann darauf, dass der Browser daran irgendetwas ändern kann?
- Sven Rautenberg
hallo Sven,
Wenn du weiter oben diagnostizierst, dass Perl verantwortlich ist für das einmalige "Kompilieren/Einlesen/Abspeichern/Wasauchimmer" des fraglichen Moduls
Dagegen scheinst du ja nichts einwenden zu wollen.
- wie kommst du dann darauf, dass der Browser daran irgendetwas ändern kann?
"das" kann der Browser nicht ändern. Es ist jedoch meine eigene höchst leidvolle Erfahrung bei vergleichbaren Fragestellungen, daß eben _auch_ (wenn auch beileibe nicht _nur_) der Browsercache dazwischenfunken kann.
Grüße aus Berlin
Christoph S.
Moin nochmal,
Das ist eine relativ genaue Beobachtung. Allerdings ist nicht Apache die Software, die da etwas zwischenspeichert, sondern Perl ist es.
--- das ist ja schonmal ein guter Tipp, danke!
Meine Suche bei Google hat mich zu diesem ausführlichen und genauen Anweisungs-Text geführt:
(http://www.farid-hajji.net/books/de/Hajji_Farid/pbv2/ew/cgi-modperl.html)
<<<START>>>
Das Modul Apache::Registry cacht nicht nur den kompilierten Code sondern auch den Zeitpunkt, an dem die Datei, die diesen Code enthält, zuletzt verändert wurde. Nun kann diese Datei verändert werden und Apache::Registry merkt das beim nächsten Aufruf und lädt diese Datei dann neu. Es ist also nicht notwendig, den Webserver neu zu starten, sobald ein unter der Kontrolle von Apache::Registry stehendes Skript verändert wird.
Leider reicht die Überwachung des Dateizeitstempels nicht weiter als zu der in der ersten Stufe eingelesenen Datei. Das ist in den meisten Fällen ausreichend, da Ihr CGI-Skript i.d.R. aus einer einzigen Datei besteht. Sobald aber diese Datei mit require() oder use() eine weitere Datei lädt, ist das für Apache::Registry nicht sichtbar. Wenn Sie jetzt eine durch require() oder use() eingelesene Datei verändern, merkt das Apache::Registry nicht. Dies kann zu schwer aufzufindenden Fehlern führen.
Sie vermeiden dieses Problem, indem Sie Apache::Registry anweisen, nicht nur das Modifikationsdatum der auszuführenden Datei zu cachen und zu überprüfen, sondern auch gleich dasjenige Modifikationsdatum aller Dateien zu überwachen, die in den durch %INC enthaltenen Pfaden (siehe Kapitel 14) im Auge zu behalten. Dies erreichen Sie dadurch, daß Sie das Modul Apache::StatINC als PerlInitHandler in ~www/conf/perl.conf installieren:
Alias /perl-registry/ /usr/local/apache/perl-registry/
<Location /perl-registry>
SetHandler perl-script
PerlHandler Apache::Registry
PerlInitHandler Apache::StatINC
PerlSendHeader On
Options +ExecCGI
</Location>
<<<ENDE>>>
Wenn ich es also schaffe, als PerlInitHandler das Modul Apache::StatINC zu verwenden, sollte meine Problematik damit behoben sein. Die einzige perl.conf-Datei auf meinem Rechner ist C:\Programme\xampp\apache\conf\extra\perl.conf und die sieht so aus:
<<<START>>>
LoadFile "C:/Programme/xampp/perl/bin/perl58.dll"
LoadModule perl_module modules/mod_perl.so
PerlRequire "C:/Programme/xampp/apache/conf/extra/startup.pl"
#<Files *.pl>
#SetHandler perl-script
#PerlResponseHandler ModPerl::Registry
#Options +ExecCGI
#PerlOptions +ParseHeaders
#</Files>
#<Files ~ (.asp)>
# SetHandler perl-script
# PerlHandler Apache::ASP
# PerlSetVar Global .
# PerlSetVar StateDir "C:/Programme/xampp/tmp"
#</Files>
###########################################
Alias /perl "C:/Programme/xampp/htdocs/modperl/"
<Directory "C:/Programme/xampp/htdocs/modperl/">
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
Options +ExecCGI
PerlOptions +ParseHeaders
</Directory>
<Files *.pl>
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
Options +ExecCGI
PerlOptions +ParseHeaders
</Files>
PerlModule Apache::ASP
Alias /asp "C:/Programme/xampp/htdocs/modperlasp/"
<Directory "C:/Programme/xampp/htdocs/modperlasp/">
SetHandler perl-script
PerlResponseHandler Apache::ASP
PerlSetVar Global .
PerlSetVar StateDir "C:/Programme/xampp/tmp"
</Directory>
<<<ENDE>>>
Egal in welche Blöcke ich die Anweisung "PerlInitHandler Apache::StatINC" einfüge: es geht nicht.
Eventuell hilfreich könnte noch die Datei C:/Programme/xampp/apache/conf/extra/startup.pl sein, die ja von perl.conf aufgerufen wird. Die sieht so aus:
<<<START>>>
#file:startup.pl
#---------------
use ModPerl::Util (); #for CORE::GLOBAL::exit
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::RequestUtil ();
use Apache2::ServerRec ();
use Apache2::ServerUtil ();
use Apache2::Connection ();
use Apache2::Log ();
use APR::Table ();
use ModPerl::Registry ();
use Apache2::Const -compile => ':common';
use APR::Const -compile => ':common';
use CGI ();
1;
<<<ENDE>>>
Hat vielleicht noch jemand eine Idee, wie und wo ich das Modul Apache::StatINC richtig einbinden kann?
Mille Grazie!
Johnny
P.S.
Eigentlich wollte ich ja was programmieren - und keinen Server administrieren... <grmplx> SO WHAT!
Hier hab ich noch was gefunden:
http://perl.apache.org/docs/1.0/api/Apache/StatINC.html
Hab aber keinen blassen Schimmer, wie und wo ich das jetzt in den Apachen reingebastelt kriege?!??