Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re: CGI.pm Caching Issue

by btrott (Parson)
on May 11, 2000 at 21:54 UTC ( [id://11194]=note: print w/replies, xml ) Need Help??


in reply to CGI.pm Caching Issue

Are you running under mod_perl or PerlEx?

From a quick glance at the CGI.pm source, it looks like it calls _reset_globals for each new object, if you're running under either of those architectures (mod_perl or PerlEx). Since I believe both of them work similarly--ie. compiling a Perl interpreter into the web server and pre-compiling modules--this would imply that when you're doing "similar" things (only compiling CGI.pm once, or using persistent CGI objects), you'll need to call _reset_globals.

Ah, here it is: this is why you're getting that behavior. In the init subroutine, there's this code:

# if we get called more than once, we want to initialize # ourselves from the original query (which may be gone # if it was read from STDIN originally.) if (defined(@QUERY_PARAM) && !defined($initializer)) { foreach (@QUERY_PARAM) { $self->param('-name'=>$_,'-value'=>$QUERY_PARAM{$_}); } return; }
So this is initializing your object with the original query, rather than the new (and possibly different) one.

And what does _reset_globals do? It calls initialize_globals, which does this:

undef @QUERY_PARAM;
There you go. In persistent situations, then, (mod_perl or PerlEx), CGI.pm needs to clean up @QUERY_PARAM--you'll need to fake this in your persistent application, then.

Calling initialize_globals would be another option--plus it's not "private" (no "_"). :)

Replies are listed 'Best First'.
RE: Re: CGI.pm Caching Issue
by takshaka (Friar) on May 12, 2000 at 00:55 UTC
    Does delete_all not take care of that? It does undef %{$self} on the CGI object.
      No, that won't do it. @QUERY_PARAM is apparently a package variable. Once you have CGI compiled and in memory, @QUERY_PARAM is set until explicitly reset or undefined.

      Note in the subroutine, the CGI object $q goes out of scope (and would thus be destroyed) at either of the return statements. btrott has it right -- Jellybean is a persistent environment like PERLEX or mod_perl, but CGI doesn't know that. We have to give it a hand.

        Okay, I was thinking @QUERY_PARAMS was getting reset from the empty param() list somewhere in there, but that doesn't seem to be the case.

        I would use the $CGI::PERLEX setting, since all it does it flag _reset_globals() to be called in the constructor and is pretty much a "set it and forget it" thing. Of course, 'undef @CGI::QUERY_PARAM' may be the only method guaranteed to work with future versions.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11194]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (5)
As of 2024-03-28 21:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found