Thread Globals in Mason (2 answers)
Opened by tsy at 2008-07-04 16:25

tsy
 2008-07-04 16:25
#111815 #111815
User since
2008-03-17
54 Artikel
BenutzerIn
[default_avatar]
Hallo!
Ich habe wieder mal ein Problem mit Mason; da ich aber diesmal eine etwas genauere Problembeschreibung geben kann und ich denke, dass das Problem auch etwas anders ist als in meinem bereits vorhandenen Thread habe ich mich entschlossen, einen neuen aufzumachen.
Ich habe ein Problem mit globalen Variablen in Mason.
Was ich möchte ist eine Variable, die die gesamte Laufzeit verfügbar ist und beim ersten Aufrufen der Startseite initialisiert wird.
die Variable ist per
Code: (dl )
PerlAddVar MasonAllowGlobals $test
deklariert worden und wird im top-Level-autohandler initialisiert.
Nun habe ich mit 2 Möglichkeiten getestet:
1. $test ist ein SCALAR, der mit time() initialisiert wird. Ergebnis -> alles prima, funktioniert.
2. $test ist ein Objekt (des Typs Mini), an sonsten die selben Bedingungen wie oben. Ergebnis -> Das Objekt wird nach einem (von mir) nicht erkennbaren Muster neu angelegt, wenn ich irgendeinen Link klicke oder die index-Seite neu lade und verliert damit natürlich sämtliche gesetzten Eigenschaften.

Ich benutze ein Frameset mit folgender Dateistruktur:

/autohandler
/index.html

/test/autohandler
/test/nocheins.mas
/test/x.html

hier kommt der Inhalt der Dateien:

/autohandler
Code (perl): (dl )
1
2
3
4
5
<%once>
use Mini;
$test = Mini->new();
</%once>
% $m->call_next;

/index.html
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>TEST</title>
<meta name="author" content="test">
<link href="style.css" rel="STYLESHEET" type="text/css">
</head>
<frameset rows="101,*" cols="*" frameborder="no" border="0" framespacing="0">
        <frame src="test/x.html" name ="header" scrolling="No" noresize="noresize"></frame>

         <frameset cols="173,*" frameborder="no" border="0" framespacing="0">
                <frame scrolling="No" noresize="noresize" src="test/x.html"></frame>
                 <frame src="test/x.html" name ="inhalt"></frame>
         </frameset>
</frameset>
<noframes></noframes>

</html>


/test/autohandler
Code (perl): (dl )
1
2
test/autohandler: <% $test %>
% $m->call_next;

/test/nocheins.mas
Code (perl): (dl )
1
2
<br>nocheins: <% $test %><br>
<a href="x.html">klick</a>

/test/x.html
Code (perl): (dl )
1
2
3
<br>
% print "x: $test";
<& 'nocheins.mas' &>

Die Mini-Klasse macht eigentlich nichts und besitzt nur einen Konstruktor:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package Mini;

use strict;

sub new{
        my $class = shift;
        my $self = {};
        my $id = int(rand(10000000));
        $id += time();
        $self->{'id'} = $id;

        bless ($self, $class);
        return $self;
}
1;


Da die Skripte ja alle sehr einfach sind habe ich scheinbar irgend etwas Grundsätzliches nicht richtig verstanden.
Was mir auch nicht ganz klar ist: Wenn ich im autohandler $test mit local $test initialisiere, dann erscheit die Variable nirgendwo. Im masonbook.com werden aber globale Variablen immer so initialisiert mit der Begründung, dass diese dann in der gesamten Wrapping-Chain verfügbar sind.
Ich wäre sehr froh, wenn mir jemand auf die Sprünge helfen könnte.

meine Konfiguration sieht so aus:
Windows XP
Apache/2.0.54
mod_perl/2.0.1
Perl/v5.8.7

Perl/Mason-config:
http://www.perlpunks.de/paste/show/485f54cc.1222.3...
startup.pl:
http://www.perlpunks.de/paste/show/485f55b2.215d.3...

Viele Grüße,

tsy

View full thread Globals in Mason