Along these same lines I'm seeking a way to store a code reference into a
global hash that is shared among all processes. For example:

my $session_id = get_session_from_cookie($r);
my $handler = $c{$session_id}->{handler};

$r->send_http_header;
print $handler->($r);
return OK;

Has anyone performed this kind of magical tidbit before? Is there some main
process repository that I can access?

-- Ryan


----- Original Message -----
From: "Rob Mueller (fastmail)" <[EMAIL PROTECTED]>
To: "French, Shawn" <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]>
Sent: Wednesday, May 29, 2002 5:35 PM
Subject: Re: Persistent Net::Telnet Objects


> Our project needed persistent socket connections open as well. There is
> supposed to be a standard mechanism to pass file descriptors between unix
> processes, though it's bugginess level depends on your OS. There is a perl
> module for this called Socket::PassAccessRights. So what you can do is
> create a daemon process that just hangs round holding socket connections
> open, like a socket cache basically, and passing them back and forth
between
> Apache processes based on some session ID or user ID or the like.
>
> Your daemon ends up looking something like this (with lots more error
> checking of course)
>
> my %sockmap;
> while (1) {
>   my $clientsock = $listen->accept();
>   chomp(my $sessionid = <$clientsock>);
>   my $cachesock = ($sockmap{$sessionid} ||= opennewsock());
>   Socket::PassAccessRights::sendfd(fileno($clientsock),
fileno($cachesock));
>   $clientsock->close();
> }
>
> And in your mod_perl code you do something like:
>
>   my $serversock = IO::Socket::INET->new(Server => 'localhost', Port =>
> SOCKETPOOLPORT);
>   print $serversock $sessionid, "\n";
>   my $Fd = Socket::PassAccessRights::recvfd(fileno($serversock));
>   open(my $realsocket, "<&=$Fd");
>   fcntl($realsocket, F_SETFD, 0);
>   my $ofh = select($realsocket); $| = 1; select ($ofh);
>
> If you do some experimenting, you'll get something that works, you'll also
> find lots of cases that don't.
>
> Rob
>
> ----- Original Message -----
> From: "French, Shawn" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Thursday, May 30, 2002 3:53 AM
> Subject: Persistent Net::Telnet Objects
>
>
> > Vitals:
> > Apache/1.3.20 (Win32) mod_perl/1.25_01-dev mod_ssl/2.8.4 OpenSSL/0.9.6a
on
> > Windows 2000 with PHP 4.21
> >
> > I am working on a project that requires me to have two telnet objects
per
> > user session opened, and accessible throughout the user's session. I
have
> > looked at Apache::Session and many other solutions but my problem is
that
> to
> > keep a Net::Telnet object, I need to keep open sockets and filehandles,
so
> I
> > cannot serialize the object and store it in a database or file.
> >
> > Currently I have similar code working flawlessly:
> > ###
> > # "startup.pl" - called when apache starts (ie. PerlRequire
> > "d:/Apache/conf/startup.pl")
> > ##
> > use MySite::Session;
> >
> > ###
> > # "Session.pm"
> > ##
> > @EXPORT = qw( %sessionHash );
> > our %sessionHash;
> >
> > ###
> > # "init_session.pl" - called IN MOD_PERL when a new session is requested
> > ##
> > use MySite::Session;
> > $sessionHash{$session_id . "_telnetObj"} = Net::Telnet->new();
> >
> > ###
> > # "dostuff.pl" - called IN MOD_PERL many time throughout the session
> > ##
> > use MySite::Session;
> > my telnetObj = $sessionHash{$session_id . "_telnetObj"};
> > bless (\$telnetObj, "Net::Telnet");
> >
> > Although this is working right now, I don't know enough [ anything? :) ]
> > about Apache or mod_perl to be sure that this will work in the future.
> What
> > I am really concerned about is that the telnetObj will only be
accessible
> > from scripts run by the same child process as that which created and
saved
> > it.
> >
> > Is there a better way to do this?
> >
> > Thanks,
> > Shawn French
> >
> >
>

Reply via email to