www.farid-hajji.net banner

Farid Hajji

Perl: Einführung, Anwendungen, Referenz (2/e) [Support-Site]

Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2

Ergänzung

apache-session1.pl
#!/usr/local/bin/perl -w
# apache-session1.pl -- Zustandserhaltung mit Apache::Session

# Damit dies funktioniert, sollte eine Tabelle 'sessions' mit
# folgender Struktur angelegt werden (man Apache::Session::DBIStore):
# create table sessions (
# id char(16) primary key,
# length int(11),
# a_session text)

use strict;

use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
use CGI::Cookie;
use Apache::Session::DBI;

# Fuer Solaris 2.6 muss der folgende Wert angepasst werden...
$Apache::Session::SysVSemaphoreLocker::nsems = 16; # Solaris 2.6: 8 or 16
                                                   # Linux: 32

use constant INITSTATE => 1;
use constant STATETTL  => '+5m';
use constant STATENAME => 'mystate';

use constant STATEDSN  => 'dbi:mysql:database=www';
use constant STATEUSER => 'nobody';
use constant STATEPASS => 'wwwpass';

my %session;
my ($state, $cookie_needed) = retrieve_state();
my $nextstate               = compute_next_state($state);
my $saveaction              = save_state($nextstate, $cookie_needed);

# Tue etwas abhaengig von $state:
print $cookie_needed ? header(-cookie => $saveaction) : header(),
    start_html('State with Cookies'),
    "Current state: ", $state->{'STATE'}, p,
    "If you call me again, I'll increment it for you",
    end_html;

sub retrieve_state {
    my $SID = cookie(-name => STATENAME);
    my ($SVL, $cookie_needed) = (INITSTATE, 1);

    if (defined $SID) {
        # Cookie gibt eine Session-ID vor:
    tie %session, 'Apache::Session::DBI', $SID,
        { DataSource => STATEDSN,
              UserName => STATEUSER, Password => STATEPASS }
        or die "can't tie: $!\n";

        $SVL = $session{'STATE'};
        $cookie_needed = 0;
    } else {
        # Das ist eine neue Sitzung!
    tie %session, 'Apache::Session::DBI', undef,
        { DataSource => STATEDSN,
              UserName => STATEUSER, Password => STATEPASS }
        or die "can't tie: $!\n";

    $SID = $session{'_session_id'};
    $SVL = $session{'STATE'};
    }

    # Den Zustand mit der zugehoerien Sitzungs-ID zurueckgeben.
    return ({ SESSION => $SID, STATE => $SVL }, $cookie_needed);
}

sub compute_next_state {
    my $current_state = shift;
    $current_state->{'STATE'} = $current_state->{'STATE'} + 1;
    return $current_state;
}

sub save_state {
    my $newstate      = shift;
    my $cookie_needed = shift;

    my $cookie   = new CGI::Cookie(-name     => STATENAME,
                                   -value    => $session{'_session_id'},
                                   -expires  => STATETTL)
        if $cookie_needed;

    # Den Zustand serverseitig speichern:
    $session{'STATE'} = $newstate->{'STATE'};

    return $cookie_needed ? $cookie : undef;
}
   

[Prev] [Up] [Relevant Chapter] [Next]

[Alte Quelle]


Last modified: $Date: 2006/05/18 12:55:46 $
FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy
FreeBSD Logo