Thread CGI::Sessions auf fremdem Server leben nur Sekunden! (11 answers)
Opened by sman at 2009-11-22 06:42

Gast sman
 2009-11-22 06:42
#128422 #128422
Hallo,

ich möchte Sessions für eine Web-Anwendung auf einem Strato-Server verwenden. Dieser hat CGI::Session nicht vorinstalliert, also lade ich das Modul Version 4.41 von CPAN und kopier es per FTP ins cgi-bin-Verzeichnis.
Nun habe ich bei meinen ersten Scripts festgestellt, dass die Sessions nicht lange leben, nur Sekunden, warum auch immer.

Zur Demonstration erstelle ich ein Script dass eine Session erstellt, ihr eine expiration von z.b. 10000 Sekunden gibt, einen Wert hinein schreibt, und mir einen Link mit der Session-ID als Querystring ausspuckt. Nach dem Ausführen des Scripts klicke ich nach Wartezeiten zwischen 1 und 10 Sekunden auf den Link, das gleiche Script öffnet sich, lädt die Session anhand der ID und versucht mir den Wert auszuspucken.

Hier der code von sessiontest.pl:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/perl58 -w
use strict;
use CGI::Carp qw(fatalsToBrowser);
use CGI::Session qw/-ip-match/;
        
my %p = ();
foreach (split /&/, $ENV{'QUERY_STRING'}) { $p{$1} = $2 if /^([^=]+)=(.+)$/; }
        
if ( not $p{'CGISESSID'} )
{
        my $SESSION = new CGI::Session("driver:File", undef, {Directory=>"/tmp"});
        $SESSION->expire(10000);
        my $sid = $SESSION->id();
        $SESSION->param( 'text_key', 'test_wert' );

        print "content-type: text/html\n\n";
        print '<a href="sessiontest.pl?CGISESSID='.$sid.'&time='.time.'">sessiontest.pl?CGISESSID='.$sid.'&time='.time.'</a>';
}
else
{
        my $SESSION = new CGI::Session("driver:File", $p{'CGISESSID'}, {Directory=>'/tmp'});
        
        print "content-type: text/html\n\n";
        print 'CGISESSID from query: '.$p{'CGISESSID'}.'<br />';
        print 'Session var "test_key": '.$SESSION->param('text_key').'<br />';
        print 'Time elapsed since session was created: '.(time-$p{'time'}).' seconds';
}


Das ganze sieht dann etwa so aus, ich führe im Browser sessiontest.pl aus und erhalte den folgenden Link auf den ich Klicke:
Code: (dl )
sessiontest.pl?CGISESSID=50e958458d79f0282bbb62c35cb24492&time=1258867064

...führt auf die Seite mit den Ergebissen:
Code: (dl )
1
2
3
CGISESSID from query: a60a5290f0101bcd16605c06d98ffcba
Session var "test_key": test_wert
Time elapsed since session was created: 1 seconds


Dies klappt jedoch nur, wenn ich nur wenige Sekunden warte und möglichst schnell den Link klicke. Schon nach ein paar Sekunden warten findet er die Sessionvariable nicht mehr. Klicke ich etwa alle 3 Sekunden auf den Link (jeweils neuer Tab) geht das gut, bis ich mal länger warte (z.b. 5sec). Dieses Experiment deutet für mich darauf hin, dasss die Session nach etwa 2-5 Sekunden Leerlaufzeit weg ist.

Woran kann das liegen?? Mache ich irgendetwas falsch? Kann es sein das Strato von Haus aus Sessions nur ein paar Sekunden lang erlaubt? Oder muss ich selbst dafür nur einen Hebel umlegen damit das klappt? Oder fehlen einfach nur flush oder load oder solche Sachen?

Bitte dringend um Hilfe!
Verzweifelnd
Martin

View full thread CGI::Sessions auf fremdem Server leben nur Sekunden!