Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
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 meditating upon the Monastery: (4)
As of 2025-03-26 15:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    When you first encountered Perl, which feature amazed you the most?










    Results (68 votes). Check out past polls.

    Notices?
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.