Schrift
[thread]12483[/thread]

Einsteigerprobleme mod_perl2

Leser: 4


<< >> 8 Einträge, 1 Seite
xtomcatx
 2008-09-12 16:05
#114566 #114566
User since
2006-08-27
31 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich habe einige Probleme beim Entwicklen mit mod_perl, vermutlich Probleme, die fast jeder schon mal hatte:

mod_perl ist für ein Verzeichnis aktiviert:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
<VirtualHost [...]
PerlOptions +Parent +ParseHeaders
PerlSwitches -I/[...]/modules
<Files ~ "\.(pl|cgi)$">
SetHandler perl-script
#PerlResponseHandler ModPerl::PerlRun
PerlResponseHandler ModPerl::Registry
PerlInitHandler Apache2::Reload
Options +ExecCGI
</Files>
</VirtualHost>


Zuerst hatte ich nur ModPerl::Registry verwendet, damit gab es nur Probleme, weil das kompilierte Skript ja gecachet wird und nur dann neu kompiliert wird, wenn das Hauptprogramm sich ändert. Irgendwann habe ich dann die Direktive PerlInitHandler entdeckt, die in Verbindung mit Apache2::Reload bewirken sollte, dass auch Änderungen an anhängigen Modulen bemerkt werden und zur Neukompilierung führen. Funktioniert im großen und ganzen auch, doch manchmal tritt folgende Situation ein:
Ich restarte den Apache
ich habe im Modul X in Zeile 23 einen Fehler. => Fehlermeldung, at Line 23
Ich behebe den Fehler und habe den nächsten in Zeile 36. => Fehlermeldung, at Line 36 (meistens, manchmal wird die Änderung scheinbar gar nicht bemerkt)
Aktualisiere ich die Seite jetzt, wird z.B. fünfmal Fehlermeldung Zeile 36 angezeigt und plötzlich wieder ein mal Zeile 23. Woran kann das liegen?

Kann ich die Cacherei fürs Entwicklen nicht temporär ganz abschalten, ohne auf mod_perl zu verzichten?

Das passiert auch mit dem ResponseHandler ModPerl::PerlRun und wie ihr euch vorstellen könnt, macht das das Entwicklen nicht einfacher, denn manchmal wird die alte Fehlermeldung auch beim ersten Refresh angezeigt.

Browsercache ist auszuschließen.
GwenDragon
 2008-09-12 18:34
#114575 #114575
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Du verwendest in deinen Modulen auch use strict; und use warnings;, damit du Fehler im Modul wirklich findest?
xtomcatx
 2008-09-12 20:14
#114580 #114580
User since
2006-08-27
31 Artikel
BenutzerIn
[default_avatar]
Ja, definitiv. Es werden auch keine globalen Variablen oder so verwendet. Das Problem ist ja nicht, dass Fehler unbemerkt bleiben, sondern dass manchmal Sachen (auch Fehler) angezeigt werden, die schon gar nicht mehr im Skript stehen (irgendwelche Debug-Ausgaben, die zwei Versionen vorher schon wieder entfernt wurden) und umgekehrt manchmal Programmteile (Debug-Ausgaben oder die()) einfach ignoriert werden.
Es handelt sich dabei wirklich um ein Problem, das ich vor mod_perl nicht hatte und das auch wieder verschwindet, wenn ich den Apache restarte. Solange ich am Code nichts ändere, läuft alles einwandfrei, aber bei manchen Codeänderungen ist dann wieder ein Restart fällig. Heute habe ich bei Fehlern, die normal in 3 Minuten zu finden und beheben sind, ne halbe Stunde gebraucht, weil manchmal dann Fehlermeldungen angezeigt wurden, die schon behoben worden sind und wo kein Fehler ist, kann man lange suchen.

Ich bin vor ein paar Jahren schonmal von mod_perl wieder zurück umgestiegen. Diesmal stecke ich schon etwas weiter drin, aber so ganz liebgewonnen habe ich mod_perl noch nicht und kann es mir momentan auch nicht leisten, mich mehrere Tage in mod_perl einzuarbeiten.
Wie dem auch sei, ich werds weiter benutzen, im Zweifelsfall nen Restart machen und vielleicht weiß ja jemand von euch Rat.
pq
 2008-09-12 21:05
#114581 #114581
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Apache2::Reload sollte eigentlich ganz gut funktionieren, ich habe aber die erfahrung gemacht,
wenn man komplizierte änderungen macht (dynamische packages erstellen, import/export etc.),
dann kann es sein, dass man neustarten muss.
wenn der fehler bei simplen änderungen auftritt, dann versuch mal, das mit möglichst wenig
code zu reproduzieren und hier zu posten.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
xtomcatx
 2008-09-16 20:54
#114717 #114717
User since
2006-08-27
31 Artikel
BenutzerIn
[default_avatar]
Hallo, ein vernünftiges Minimalbeispiel konnte ich in annehmbarer Zeit noch nicht finden.
Allerdings ist mir etwas anderes aufgefallen. Warnungen sind zwar aktiviert, gehen aber nichts ins eingestellte ErrorLog für den VirtualHost, sondern ins "zentrale" ErrorLog. Das Problem tritt nur in Verbindung mit mod_perl auf. Woran kann das liegen? Das LogLevel wurde auch für den VirtualHost auf "warn" gesetzt.

Nachtrag: das ist scheinbar standardmäßig so und ist nur über Apache2::Log zu lösen. Wie im VirtualHost, daran arbeite ich noch.
xtomcatx
 2008-09-16 23:44
#114718 #114718
User since
2006-08-27
31 Artikel
BenutzerIn
[default_avatar]
Ich bin zu dem Schluss gekommen, dass mir mod_perl zur Zeit mehr Ärger bereitet, als Nutzen bringt und nachdem ich eh unter Zeitdruck stehe, kann ich mir das nicht leisten. Das heißt, ich werde erstmal ohne mod_perl weiterarbeiten. Vielleicht kann mir doch jemand noch nen Tip geben, wie er die Warnungen im ErrorLog ablegt, das im VirtualHost angegeben ist. Und zwar so, dass das einmal in der Konfiguration des VHost abgelegt wird und nicht in jeder einzelnen Datei einzustellen ist. Meiner Meinung nach müsste das mit Apache::Log gehen, aber zum einen hab ich da noch nicht so ganz durchgesehen, zum anderen verstehe ich nicht, wieso dieses Verhalten überhaupt so ist. Errors werden ja auch in der VHost-Datei abgelegt.
MartinR
 2008-09-17 09:19
#114719 #114719
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
Hallo, und vorab erst mal folgendes: Ich habe von mod_perl keine Ahnung und von Perl an sich nur geringfügig mehr ;-) Aber kann man nicht den Server anweisen Skripte die in einem bestimmten Verzeichnis liegen, z.B. also /cgi-bin/ als "normale" CGIs laufen zu lassen, hingegen die im /mod_perl/ eben unter mod_perl? Wäre es dann nicht möglich - ich verwende z.B. CGI::Application - in beide Verzeichnisse ein Startscript wie i.e. folgendes zu legen:
Code: (dl )
1
2
3
4
5
6
7
#!/usr/bin/perl
use lib "/usr/local/httpd/pfad_zu_myapp/";
use strict;
use warnings;
use MyApp;
my $webapp = MyApp->new();
$webapp->run();

Der eigentliche code liegt dann ganz wo anders. Worauf ich hinaus will. Je nachdem über welchen Pfad ich aufrufe starte ich als cgi oder mod_perl. So lange ich also noch am entwickeln bin rufe ich immer die cgi-Version auf. Änderungen an den Skripten werden dann immer gleich wirksam. Und in bestimmten Abständen test ich dann eben ob es unter mod_perl auch läuft.

Wenn dies ein Ansatz ist, freue ich mich. Wenn nicht, steinigt mich eben oder schmeißt mich mit Gewichten an den Füßen in den See ...
GwenDragon
 2008-09-17 14:26
#114731 #114731
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
In der mod_perl-Konfiguration des Servers und in der der VirtualHosts wird doch eingestellt, welches Verzeichnis zuständig ist.

Beispiel (wird auf deinem Server anders aussehen):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# execute as mod_perl2 in http://meinserver.de/perl/
Alias /perl/ /usr/local/apache2/modperl/
<Directory /usr/local/apache2/modperl/>
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
PerlOptions +ParseHeaders
Options +ExecCGI
Order deny,allow
Allow from all
</Directory>

# execute as CGI in subdir http://meinserver.de/cgi-bin/
Alias /cgi-bin/ /usr/local/apache2/cgi-bin/
<Directory /usr/local/apache2/cgi-bin/>
AddHandler cgi-script .cgi .pl
Options +ExecCGI
Order allow,deny
Allow from all
</Directory>


//EDIT: Aus Versehen mod_perl1.x genommen

Quote
Aber kann man nicht den Server anweisen Skripte die in einem bestimmten Verzeichnis liegen, z.B. also /cgi-bin/ als "normale" CGIs laufen zu lassen, hingegen die im /mod_perl/ eben unter mod_perl?

Außerdem kannst du in einer .htaccess festlegen, ob dort die Skripte als CGI oder mod_perl laufen.

Durch SetHandler cgi-script erzwingst du CGI und durch SetHandler perl-script mod_perl.
<< >> 8 Einträge, 1 Seite



View all threads created 2008-09-12 16:05.