Well, I still can't muster the magic to get $Session properly[1] viewable from ASP::XMLSubs or any other module, but here's how to get Apache::Session working in a very basic way:
--- httpd.conf --- PerlSetVar NoState 1 --- global.asa --- BEGIN { @Apache::ASP::Objects = qw(Server Application Request Response); } use Apache::Session::MySQL; use ASP::Session; ... Script_OnStart { &start_session; } --- ASP/Session.pm --- package ASP::Startup; use Exporter; use vars qw(@ISA @EXPORT); @ISA = qw(Exporter); @EXPORT = qw(start_session $Session %session); my $SESSION_EXPIRY = 60 * 20; # In seconds our $Session; our %session; sub start_session { my %session_connect = (); # Apache::Session connection settings # Attempt to tie %session to the id from the cookie, or create a # new session. eval { tie(%session, 'Apache::Session::MySQL', $main::Request->Cookies('_session_id'), \%session_connect); }; if ($@) { die $@ unless $@ =~ /Object does not exist/; # Re-throw # The session's been cleaned up, so create a new session. tie(%session, 'Apache::Session::MySQL', undef, \%session_connect); } # If the session is more than $SESSION_EXPIRY seconds old, delete # it and start anew. if ($session{'_update_time'} && time >= $session{'_update_time'} + $SESSION_EXPIRY) { tied(%session)->delete; tie(%session, 'Apache::Session::MySQL', undef, \%session_connect); } $session{'_update_time'} = time; $Session = \%session; $main::Server->RegisterCleanup(sub { untie(%session); }); $main::Response->Cookies('_session_id', $session{'_session_id'}); } 1; Note that you'll still need something to purge old sessions from your Apache::Session store. I created my session table like so: CREATE TABLE `user_session` ( `id` varchar(40) NOT NULL default '', `a_session` text, `a_update` timestamp NULL default NULL on update CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM The timestamp lets me purge old sessions every hour. [1] $Session /is/ accessible through $Apache::ASP::Compiles::__ASP__var_www_document_rootx::Session, but not main, leading to the very /very/ ugly hack: my $session_obj = eval '$' . caller() . '::Session'; my $foo = $session_obj->{'FOO'}; No idea why that works. --- In [EMAIL PROTECTED], "Eamon Daly" <[EMAIL PROTECTED]> wrote: > > I know this has been mentioned before on the list, but I'm having a > heck of a time overriding $Session with Apache::Session. Josh advises: > > "...I would use Apache::Session, which you can easily configure > to use by setting 'PerlSetVar AllowSessionState Off' and then setting > $Session to the Apache::Session object created in Script_OnStart." > > http://groups.yahoo.com/group/apache-asp/message/1559 > > In Script_OnStart, I have: > > use vars qw(%session); > my $id = $Request->Cookies('_session_id') || undef; > tie %session, 'Apache::Session::MySQL', $id, \%session_connect; > $Session = \%session; > $Server->RegisterCleanup(sub { untie(%session); }); > $Response->Cookies('_session_id', $session{'_session_id'}); > > There's clearly a scoping issue there, though, because although both % > session and $Session are populated and read/writable within > Script_OnStart, they aren't from actual pages. I can fix that with > Script_OnParse: > > my $code = $Server->{ScriptRef}; > $$code = '<% $Session = \%session %>' . "\n$$code"; > > which seems /awfully/ clumsy. Is that really TRWTDI? > > Secondly, I have an XMLSub that looks for certain information in > $Session. Previously, I could refer to $main::Session, but that > doesn't fly with the new overridden object. I don't know a way around > this one. > > Any help would be appreciated. Thanks! --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]