Re: Reloading Apache::Registry modules without restarting Apache
André Warnier <[email protected]>
| Newsgroups | gmane.comp.apache.mod-perl |
|---|---|
| Message-ID | <[email protected]> |
André Warnier wrote:
> Desilets, Alain wrote:
>> I'm using mod_perl on Windows 7, and am trying to set things up so
>> that I can reload my script and all the modules it uses, without
>> having to restart Apache.
>>
>> The problem is that my script (called webitext.cgi) updates the @INC
>> variable using statements like these:
>>
>> ---
>> use lib "$ENV{WEBITEXT_HOME}";
>> use lib "$ENV{WEBITEXT_HOME}/bin";
>> etc...
>> ---
>>
>> where the value of $ENV{WEBITEXT_HOME} is set differently depending on
>> the virtual host it's running on. I use this so I can have two
>> versions of my app on the server, a production and a test version,
>> each running under a different vhost which defines the env variable
>> differently (using Apache SetEnv).
>>
>> The problem is that when Apache::Reload tries to reload the modules,
>> it does not find them, because it seems to use the value of @INC as it
>> was BEFORE the script was run (i.e. not including the ones added with
>> the 'use lib' statements).
>>
>> This problem occurs whether I use the 'PerlSetVar ReloadTouchFile'
>> approach or the Apache::StatINC approach. It seems to be a well
>> documented limitation of Apache::Reload.
>>
>> So... I thought about setting the @INC path outside of the script. But
>> I need to do this on a per-vhost basis. According to this page:
>>
>> http://perl.apache.org/docs/2.0/user/config/config.html#Modifying_C__INC__on_a_Per_VirtualHost
>>
>>
>> I should be able to do this with something like this:
>>
>> ---
>> <VirtualHost ...>
>> ServerName webitextprod
>> PerlOptions +Parent
>> PerlSwitches -Idir1 -Idir2 etc...
>> </VirtualHost>
>> ---
>>
>> But when I tried this and ran httpd.exe -t -c httpd.conf, it crashed
>> with the dreaded "free to wrong pool" error:
>>
>> ---
>> Free to wrong pool 2b60100 not 3d4f10.
>> ---
>>
>> This error seems to be caused by the PerlOptions +Parent line.
>>
>> Any suggestion for how to fix or get around this problem would be
>> greatly appreciated.
>>
> Hi.
> I do not know much about the "reload" side of things, but something in
> the general logic of what you explain above is going against what I know
> of the Apache logic.
>
> Contrarily to what you seem to expect above, an Apache "virtual host" is
> not a separate process.
> Apache starts as a single process, and then it forks "children". Each of
> these children is a separate process. But the "virtual host identity"
> is something dynamic. Each Apache child can "become" one of the virtual
> hosts, at each request. It just "switches personality" depending on
> which Host: header is contained in the current request that it processes.
> In other words, it does not really make sense to expect a different lib
> path per virtual host, since the perl modules and scripts exist on a
> "one per process" base, not a "one per virtual host" base.
> Or, you have to really set the lib path dynamically, on a per-request
> base, not just when your script is first compiled.
>
>
Addendum :
I re-read your post, and noticed that you were under Windows. In that case, Apache does
not really "fork children", it runs threads. But the general idea above remains : each
thread will adopt the personality of the virtual host corresponding to the Host: header of
the current request. Things may even be a little bit more confusing; I am not sure, but I
think that if you change the lib path on-the-fly in one thread, it may even affect all
threads currently running.