I think you are confusing @INC and %INC.  You should probably read up on the
difference between the two.  The mod_perl guide provides a lot of background
on this issue:
http://perl.apache.org/docs/general/perl_reference/perl_reference.html#use__
__require____do_____INC_and__INC_Explained

In any case, @INC and %INC are only used to load modules.  You can't have
multiple versions of the same package loaded at the same time in a single
interpreter (even outside of mod_perl) since the symbols in the symbol table
can only point to one thing at a time.  Remember that there's only one Perl
interpreter per child process (in Apache/mod_perl 1.x).  If you try to load
the same package again via `require' you'll overwrite the old symbols and,
if you have warnings on, generate a bunch of redefine warnings.

As you discovered, Apache::PerlVINC is just a work-around that reloads every
module (at least those that you say matter) on every request.  That's the
best you can do unless Perl starts supporting some method of side-by-side
versioning of modules.

--
Kyle Oppenheim
Tellme Networks, Inc.
http://www.tellme.com

----- Original Message -----
From: <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, December 10, 2002 5:29 PM
Subject: Per Vhost @INC


> This has come up a few times but I still do not fully
> understand how it works. Here is my situation.
>
> I have a body of software that runs in a specific
> namespace with about 10 libraries. (TourEngine::**). I
> have many versions of this software and will need the
> ability to, on the same server, run multiple instances of
> this software with different versions for a variety of
> reasons.
>
> Using a PerlRequire in the vhost seems to add the @INC for
> the entire vhost population on the server, not just my
> vhost. This results in 'first match wins' behavior since I
> would now have an @INC entry for each TourEngine::**
> directory. I tried Apache::PerlVINC but it wants to reload
> each module on each request and it seems to want to 'own'
> a location space. My modules actually get required as part
> of my HTML::Mason code, they do not handle the entire
> Location.
>
> I tried the PerlFixupHandler and a use libs declaration
> but that just gave me error messages like 'Undefined
> subroutine &lib(use::handler called.' which makes me think
> I have the syntax wrong there and I can not find another
> syntax example.
>
> My preference is not to have to set my @INC in every
> component/lib I call but to have it set in the config
> globally for that Vhost.
>
> So, does anyone have any ideas on how I can load a per
> vhost @INC that doesn't appear to other Vhosts? I want my
> TourEngine::** namespace to be a unique @INC per vhost.
>
> Thanks
> John-
>

Reply via email to