in reply to Re^2: RFC Singleton Sessions
in thread RFC Singleton Sessions

A singleton is basically the same thing as a global variable. In Perl, that's typically how they are implemented -- you put your session object into some package variable in the MySession namespace, or in mod_perl you might put in $r->pnotes.

What this means for you is that any time you create a session object, either from a cookie or by generating a totally new one and adding a cookie, you keep the session object around in this global for anyone else who needs it during the request. At the end of the request, if you put it in a package variable and not pnotes, you have to make sure to clear it and save the session. Is this making more sense to you now?

Replies are listed 'Best First'.
Re^4: RFC Singleton Sessions
by derby (Abbot) on Dec 08, 2006 at 16:07 UTC

    [id://perrin]. Yep clear. Basically, borrowing from Apache::Singleton, here's the relevant code.

    package My::Session; ... use vars qw( $GLOBAL_SESSION ); ... sub new { my( $class, $args ) = @_; $args->{log} ||= My::Log->new(); my $instance = $class->_get_instance( $args ); unless( defined $instance ) { $instance = $class->_new_instance( $args ); $class->_set_instance( $instance ); } return $instance; } sub _get_instance { my( $class, $args ) = @_; if( $ENV{MOD_PERL} ) { $args->{log}->debug( "Getting mod_perl session instance" ); my $req = Apache->request(); my $key = "$class\::_instance"; return $req->pnotes( $key ); } else { $args->{log}->debug( "Getting cgi session instance" ); return $GLOBAL_SESSION; } } sub _new_instance { my( $class, $args ) = @_; my $self = {}; $self->{log} = $args->{log}; $self->{log}->debug( "creating new session instance" ); bless $self, $class; # call method to load access privs here return $self; } sub _set_instance { my( $class, $instance ) = @_; if( $ENV{MOD_PERL} ) { $instance->{log}->debug( "setting new mod_perl instance" ); my $req = Apache->request(); my $key = "$class\::_instance"; $req->pnotes( $key, $instance ); } else { $instance->{log}->debug( "setting new cgi instance" ); $GLOBAL_SESSION = $instance; } }

    -derby