perl-embperl mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Luiz Fernando B. Ribeiro" <l...@engenhosolucoes.com.br>
Subject Re: Apache virtulahosts sharing modules
Date Wed, 21 Jul 2004 11:57:41 GMT
Steve Wilder wrote:
> 
>  Hello, all.
> 
>  I'm using Apache 1.3.29 and  Embperl 1.3.6
> 
> I've got two Apache Virtualhosts: www.benwilder, and rhyme.benwilder.com
> 
> Both sites have a "test1.phtml" which looks like this:
> ----------------------------
> [! use test1; !]
> 
> [+ test1::whereami() +]<br>
> ----------------------------
> 
> Both sites have a test1.pm file which sits in their Document Root
> 
> Live's test1.pm looks like this:
> ----------------------------
> package test1;
> 
> sub whereami {
>   return "live";
> }
> 1;
> ----------------------------
> 
> Rhyme's test1.pm looks like this:
> ----------------------------
> package test1;
> 
> sub whereami {
>   return "rhyme";
> }
> 1;
> ----------------------------
> 
> The problem is that if I reload one or the other enough times, it will 
> begin using the other sites test1.pm!  I need each site to only use it's 
> own test1.pm.
> 
> If I restart Apache, the problem goes away for a time, but will come 
> back if I reload one or the other enough times.
> 
> BTW: In my httpd.conf, I set "PerlSetEnv PERL5LIB" in the VirtualHost 
> directive to its own Document Root.
> 
> How do I lock each VirtualHost to it's own test1.pm module?


Its a common need in web development and the best way I found was to 
develop a base class, say "Clients.pm" and inherit it in each client 
namespace, say "Client_XYZ.pm", example:

Clients.pm:
package Clients;

# Defines methods
# Connects to database, do caching and other common features


Client_XYZ.pm:
package Client_XYZ;

use base Clients.pm;

my $app = Client_XYZ->start;

sub new {
	$app->reload() unless $app->state_valid();
	$app->connect() unless $app->conected();

	retun $app;
}

sub start {
	# Call SUPER->new if needed
	# Do whatever initialization you need
	
	# returns the object
}


This is just a simple scheme but it is the way I have been doing with my 
clients (virtualhosts on same server). This approach creates a namespace 
for each client to avoid conflicts, and you can override, if needed, the 
base class methods.

Its important to note that you should not connect to the database on 
Apache initialization since the database handler will be shared and 
cause problems. Put your connection code on the new method and let each 
instance of apache gets its own handler.

I don't know if this looks too complicated but, as suggested before, we 
can discuss this and other people solutions a bit more if anybody wants.

---
Luiz Fernando B. Ribeiro
Engenho Soluções para a Internet
+55 11 4485-0136

---------------------------------------------------------------------
To unsubscribe, e-mail: embperl-unsubscribe@perl.apache.org
For additional commands, e-mail: embperl-help@perl.apache.org


Mime
View raw message