On 01/21/2007 04:55 PM, tom tom wrote:
Hi,

In my mod_perl (Authentication module). I have global
variable defined as follows

use vars qw( $SESSION_CLEANUP_COUNTER);
$SESSION_CLEANUP_COUNTER=0;


my intention is to count no of times it is getting
executed by clients (no of hits). I am incrementing it
within Authenticate method as follows.
$SESSION_CLEANUP_COUNTER ++,

But everytime it prints 1.

How can I get this going,


I am not an expert in mod_perl.

Mod_perl is good with making program loading more efficient, but my experience has been that it's not very good a storing constantly-changing data such as the counter you created.

Apache starts several processes to handle requests, and mod_perl is active in each process, but each process has its own data, and you can't guarantee that the same process that handles *this* request will handle the *next* request.

For example, take these four processes:
USER            PID  PROGRAM
root            5105 apache2
www-data        5106 apache2
www-data        5107 apache2
www-data        5108 apache2

Any requests will be served by either pid 5106 or 5107 or 5108. If 5106 gets the first HTTP request, the instance of mod_perl in 5106 will set $SESSION_CLEANUP_COUNTER in 5106, but 5107 and 5108 will be unaffected.

If the next request goes to 5107, $SESSION_CLEANUP_COUNTER will start off with an "undef" value. If you keep quickly hitting "refresh" on the page, you should eventually see some incrementing--but it will be uneven because each apache2 process will have a different $SESSION_CLEANUP_COUNTER, and the assigning of HTTP requests to apache sub-processes seems to be semi-random.

Mod_perl is great for making static data and module procedures more efficient; however, I think that data that *must* be updated in a linear fashion yet shared between several apache processes should be stored externally--in a database or a file (on ramdisk?) or in IPC.

Again, this is my €0.0002 from my limited experience with mod_perl and a lot of deduction.

Well perhaps there was a little induction too: try this program to prove to yourself that each mod_perl process has a different copy of the $sc variable:

use strict;
use warnings;
our $sc;
$sc++;

print "Content-Type: text/html\n";
print "\n";

print qq{
<title> Session Cleanup Test </title>

<p> This is a test: $sc . <br>
PID: $$
</p>

};

__END__

Keep hitting refresh. So long as the PID stays the same, $sc increments normally, but when apache assigns a new sub-process to deal with requests, $sc restarts at the beginning (1).


--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to