Schrift
[thread]12132[/thread]

Globals in Mason

Leser: 1


<< >> 3 Einträge, 1 Seite
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
tsy
 2008-07-15 12:53
#112131 #112131
User since
2008-03-17
54 Artikel
BenutzerIn
[default_avatar]
Ich habe das Problem nun umgangen, indem ich das Objekt bei jedem Aufruf der Konponente aus der Datenbank neu initialisiere.
Trotz allem würde mich interessieren - wenn schon keiner eine Lösung kennt - ob vielleicht jemand ähnliche Probleme oder Erfahrungen gemacht hat!?

Viele Grüße, tsy
Gast Gast
 2008-07-19 02:55
#112319 #112319
Mal abgesehen davon, dass ich nicht verstehe, warum jemand framesets verwendet, wenn er mason hat (oder überhaupt), sind globale variablen auch in Mason nicht "global" in allen Apache prozessen, daher erscheint mir der Punkt 2, dass es bei neuladen bzw. Link anklicken einen anderen Wert hat als durchaus normal, eher ist mir rätselhaft, warum es wie in Punkt1 steht, mit einem Skalar gehen soll.

Globale variablen in Mason dienen M.E. lediglich dazu, während EINES Requests eine Varibale global zur Verfügung zu haben, (wie Mason's $m). Das ginge auch mir $r->pnotes, ist aber mit einer Mason globalen Variabalen schicker. Das BEDINGT, dass diese Variable zu Beginn eines Requests initialisiert wird.

Wenn du eine Variable beim Server-Start nur EINMAL initialisieren möchtest, muss du einen eigenen Mason-Handler schreiben, das ist ja dann aber nur bei read-only Werten sinnvoll.
Rolf
<< >> 3 Einträge, 1 Seite



View all threads created 2008-07-04 16:25.