http://www.perlmonks.org?node_id=929042

S0ldier has asked for the wisdom of the Perl Monks concerning the following question:

Hi!

I'm new to perl programming and i have this problem : I'm trying to write an apache handler for the response phase.

This Handler is caricated at the apache startime and instantiate a litle bit variable that can be used by all the request. I want change a variable by one request and the another request have to read the updated value of the variable. This not succed...but...if a reload de page eight time the value is updated on all the request :O!!!How this can happean???This is some configuration parameter to set??? Or my code is not right...:(.

If help i can post the code.

I hope you can help me...

Thanks in advatage.

MB.

Replies are listed 'Best First'.
Re: mod_perl variable persistence across request and/or session
by davido (Cardinal) on Oct 01, 2011 at 21:38 UTC

    mod_perl is a persistent process, but there's no guarantee that from one load to the next you will get the *same* persistent process; Apache can spawn multiple threads which each handle requests, but don't know about the state of the other requests. The persistence makes mod_perl tricky from the standpoint that globals may retain values from one hit to the next. But it also makes mod_perl tricky from the standpoint that from one hit to the next you may not get the same process.

    CGI in general (and by derivation, web server frameworks too ) is stateless. mod_perl is not only stateless, it's deceptive in that it can sometimes give the impression of maintaining state (and usually when you don't want it to).

    If you really want to maintain state between loads, do it explicitly using cookies and a database or temp-files, and/or send JSON packets back and forth, as frameworks such as Mojolicious do in a restful way.


    Dave

      Ok i get apache documentation and read about mpm configuration and there is a problem whit the "global" variables... Now i think to implement the features with tmp files...i think it should work... I' m interesting about the JSON methods...i don't know it and if you can post some link to get documentation a little how to in mod_perl it will be fantastic!!!:) Thanks all for the answers!
        the previus post was obviously mine...i was not logged in :(

        :)!!!

Re: mod_perl variable persistence across request and/or session
by zwon (Abbot) on Oct 01, 2011 at 16:41 UTC
    If help i can post the code.

    Yes, you should post the code, it would help.

    There maybe several reasons why this happens, but the main is that apache normally starts several worker processes. When you send request to apache it is handled by one of workers, and any variable changed by this worker will be changed only for this worker, it doesn't affect other processes. If you want to maintain variable common for all processes you should keep it in shared memory or in database

Re: mod_perl variable persistence across request and/or session
by bluescreen (Friar) on Oct 01, 2011 at 19:21 UTC

    Hi,

    I think the problem is that Apache fires up multiple threads so each thread has its own copy of the variable every request the variable gets updated but in a different threads if you refresh enough you'll see the variable updated. Another caveat is that every X request Apache terminate the thread and fires a new one so the variables will be lost.

    My advice is to use some sort of storage to save the state.

Re: mod_perl variable persistence across request and/or session
by Anonymous Monk on Oct 02, 2011 at 12:34 UTC
    HTTP is stateless, on the one side, and there can be any number of (unrelated... isolated...) service processes on the other side. This is what makes HTTP so easy to scale-up. If you need for the processes to share information, you must use something like "memcached" (memory-cache daemon) or some other persistence mechanism. If you happen to be using Perl Goodness, such as Moose, that might just be a "role."