Johnny: Apache soll Module aktualisieren

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

  1. 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.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. 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

      --
      "Love your nation - respect the others."
      1. 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.

        --
        Visitenkarte
        ss:| zu:) ls:& fo:) va:) sh:| rl:|
    2. 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"

      Only for NT + w2k + XP Professional

      #<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
      #---------------

      enable if the mod_perl 1.0 compatibility is needed

      use Apache2::compat ();

      preload all mp2 modules

      use ModPerl::MethodLookup;

      ModPerl::MethodLookup::preload_all_modules();

      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!

      1. 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?!??