Schrift
[thread]10227[/thread]

PerlRequire wird mehrfach ausgeführt

Leser: 2


<< >> 9 Einträge, 1 Seite
SSilence
 2007-08-27 17:00
#98709 #98709
User since
2007-08-27
4 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo allerseits,

bin neu hier und hab mich angemeldet, weil ich unbedingt eure Hilfe brauch.

Ich hab eine startup.pl die ich mit

Code: (dl )
PerlPostConfigRequire startup.pl


in httpd.conf von Apache 2.2 aufrufe. Diese enthält zum Test folgendes:

Code: (dl )
1
2
3
4
5
6
7
#!/usr/bin/perl
my $file = 'c:\tmp\test.txt';
open(INFO ,">>$file") || die "Fehler $!";
print INFO "test\n";
close INFO;
print STDERR "test...\n";
1;


Nun das Problem: es erscheint in der test.txt 4 mal "test", in der error.log von Apache allerdings nur ein mal. Scheinbar wird das Skript also 4 mal ausgeführt (aber nur einmal wird print richtig durchgeleitet). Eigentlich sollte es doch aber nur einmal ausgeführt werden.

Hat jemand eine Idee woran das liegen könnte???

Freu mich sehr über Hilfe!!

Liebe Grüße
Tobi
sid burn
 2007-08-27 17:15
#98710 #98710
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Du öffnest die Datei zum anhängen, nicht zum überschreiben. Also wird auch jedesmal ein "test" an der datei hinzugefügt beim ausführen.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
SSilence
 2007-08-27 17:34
#98711 #98711
User since
2007-08-27
4 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich starte den Apache Server einmal, mit einer leeren test.txt und es steht anschließend vier mal "test" drinnen d.h. das Skript muss vier mal ausgeführt worden sein, obwohl nur einmal "PerlRequire startup.pl" in der httpd.conf steht.
MisterL
 2007-08-27 17:37
#98712 #98712
User since
2006-07-05
334 Artikel
BenutzerIn
[default_avatar]
Das ist also die angedeutete Korrektur:
Code: (dl )
open(INFO ,">$file") || die "Fehler $!";

Vielleicht lohnt auch ein Nachdenken über
Code: (dl )
open(INFO ,"+<$file") || die "Fehler $!";


Gruss MisterL
“Perl is the only language that looks the same before and after RSA encryption.”
SSilence
 2007-08-27 17:45
#98713 #98713
User since
2007-08-27
4 Artikel
BenutzerIn
[Homepage] [default_avatar]
Vielen Dank für das Beispiel: mein Problem ist allerdings, dass das Skript vier mal ausgeführt wird. Eigentlich werden an der Stelle, wo hier in die test.txt Datei geschrieben wird, viele Module eingebunden.

Mein Problem hierbei: das Ganze wird vier mal ausgeführt, d.h. alle Module werden dann vier mal kompiliert was sehr zeitaufwendig und unnütz ist. Meine Frage: warum ist das so und wie kann man das dem apache/mod_perl abgewöhnen?
ptk
 2007-08-27 22:45
#98732 #98732
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Je nachdem, wie du deinen Apache startest, kann es sein, dass zuerst ein configtest gemacht wird, bei dem auch der gesamte Perl-Code ausgeführt wird. Aber das würde nur 2x erklären, nicht 4x.
kristian
 2007-08-27 22:47
#98733 #98733
User since
2005-04-14
684 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo

Es wird wohl daran liegen, dass dein Indianer mehrere Prozesse startet die auf Kunden warten.
Guckst du:
Google bzw. Apache
Ich bin zwar kein Flachmann dafür - mod_perl habe ich durch FCGI ersetzt - aber es scheint mir sinnig in dieser Richtung die Lösung zu suchen bzw. die Situation zu erkennen.

Gruss
Kristian
ptk
 2007-08-27 23:41
#98736 #98736
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich glaube nicht. Typischerweise passiert das ganze Perl-Parsen einmalig im Apache-Root-Prozess.
SSilence
 2007-08-28 12:03
#98750 #98750
User since
2007-08-27
4 Artikel
BenutzerIn
[Homepage] [default_avatar]
Vielen Dank für eure Unterstützung. Ich hab nun die Erklärung in der Maillingliste von mod_perl bekommen und post sie hier nochmal abschließend, könnte bestimmt noch für den ein oder anderen interessant sein!

> Yes, as Foo observed, this will happen 2x on Unix, 4x on Windows due to the MPM.
>
> Notice that 1x and 2x (and 5x and 8x and 11x upon restarts) are all occurring
> in the parent. They aren't in the worker process at all, they were only pre-
> tested to ensure your script compiles and runs.
>
> The 3x and 4x times are in the child process that serves your request. First
> to pretest the config (yes, again!) and then the copy that will persist until
> the worker process terminates.
>
> Upon a graceful restart, that copy dies, the config is reprocessed in the parent
> 1x only again, and then 2x in the child.
>
> We could (obviously) dump the extra success-test in the child. But doing so
> would break a huge assumption by coders like yourselves that rely on the pre
> test followed by the actual run.
>
> On Unix, you will see it run 1x for config test, followed by the 2x for the
> worker children. On a graceful restart, you'll see it happen a 3x time, etc.
>
> Bill
<< >> 9 Einträge, 1 Seite



View all threads created 2007-08-27 17:00.