Desilets, Alain wrote:
I'm a complete newbie to mod_perl, and after reading the following 
documentation:

http://perl.apache.org/docs/1.0/guide/porting.html

I am scared witless by the fact that many variables don't get reinitialized 
between calls to the CGI scripts.

Particularly scary is the example provided on that page, where the 
authentication status is stored in a global variable that doesn't get 
reinitialized. In that example, if Joe logs into the system, and Jane then runs 
the script, she can get access to the system also without every logging in, 
because Joe's authentication status is still there. YIKES!

...
Well, yes.  mod_perl does not like sloppy programming.
On the other hand, if you take care to always initialise your variables at the beginning of the script, you will avoid such problems.
And you do initialise your variables always, don't you ?

On the other hand, these global variables which do not get re-initialised automatically, are extremely useful when what you want is just that : cheap persistence between calls. Imagine a big table that you need to load once, and then just read repeatedly within your script. Instead of repeatedly reloading the table at each call to your script, you can just read it once (when it is still undefined), and then forever use the content across your cgi-bin's executions.

our $big_table;
unless (defined $big_table) {
  $big_table = go_fill_it($from_file) or die "cannot fill the table";
}

Just remember that your script can live in several separate Apache children, and each one has its own copy of your script (and of the table). So it is not really an Apache-global table. It is only persistent within this Apache child, as long as this child lives.




Reply via email to