Bernhard Peissl: Variablenverwaltungsverhalten von Perl/CGI

Beitrag lesen

Hallo,

das sind aber alles globale Variablen, keine my-Variablen. Der Grund hierfür ist das diese Variablen zwar im Verteiler erzeugt werden, aber später in den Unterroutinen noch gebraucht werden...

Also, wenn sie nur für _Unter_routinen gebraucht werden, dann sind my-deklarierte Variablen auch dort noch sichtbar. Anders wäre es, wenn sie in Eltern-Funktionen benötigt werden. Bsp:

my v;

sub f1 {
 my v1;
 sub f2 {
  my v2;
 }
}

v1 existiert für f1 und f1, v2 allerdings nur für f2, v existiert sowohl in f1 als auch in f2 und im "Hauptprogramm" !

aber was passiert jetzt wenn z.b. User1 einen Service aufruft, die Routinen werden abgearbeitet und die aufgerufene Seite dargestellt... direkt nach User1 hat aber User2 auch eine Abfrage geschickt, die Variablen von User1 wie z.b. die $sessionid wird also mit der von User2 belegt. Eine Routine die noch User1 bearbeitet braucht die Variable aber noch, was passiert dann?

Nix, denn für jeden User der dein Perl Script aufruft werden alle Variablen/Funktionen neu angelegt, eine ganz neue Instanz deines Scripts erzeugt. Das funktioniert so ähnlich wie ein Funktionsaufruf: In der Unterfunktion werden mit jedem Aufruf auch wieder die Variablen neu übergeben, Werte verändert, ...  Da ein Perl-Script immer neu aufgerufen wird kann sowas nicht passieren.

Wenn du z.b. mit Servlets arbeitest, musst du genau dies beachten. Ein Servlet wird einmal gestartet und läuft bis man es (händisch) wieder abschaltet. Dazwischen werden die Requests der User abgearbeitet. Dazu werden für jeden Aufruf "Threads" erzeugt, die, wie oben bei Perl, eine neue Instanz des Servlets erzeugen.

Das kann natürlich alles parallel/gleichzeitig passieren.

Ich hoffe ich habe dein Problem richtig gedeutet, und dir halbwegs verständlichmachen können wie das funktioniert ;-)

lg bernhard