refactoring client"s decision
refactoring client"s decision
am 11.05.2008 08:52:40 von Marc Lambrichs
I've taken over some code for a client. They've built a framework that
used to run under mod_perl and changed it later, because of problems
they had - what problems remains unknown - to cgi. Ofcourse I'm curious
why they changed it. Here's my view: they create a parent App::Handler
and in every virtual host they create a Site::Handler which has
App::Handler as base. My first guess is that under mod_perl you don't
know which Site::Handler will be called. Ofcourse, at first, the handler
you're actually pointing to will be called, but if you change the
request to another virtualhost, the wrong handler will be called.
This would explain why it's running perfectly under cgi, because in
every script call the correct lib path is defined.
So, my first question is: am I right?
Secondly, what if we're running the cgi under speedycgi?
Thx,
Marc
Re: refactoring client"s decision
am 11.05.2008 14:08:33 von mpeters
Marc Lambrichs wrote:
> So, my first question is: am I right?
Yes. And it's not a mod_perl thing, it's a Perl thing. You can't have multiple
modules with the same name. Now people try this more under mod_perl because they
think different requests behave differently, but that's not the case. Each
request will hit the same long-running Perl interpreter.
> Secondly, what if we're running the cgi under speedycgi?
I don't know. I haven't used speedycgi. FastCGI seems to be what most people
prefer these days, but I don't know about it's problems either.
Typically how people solve this under mod_perl is to give each client it's own
namespace. So you'll have Client1::App::Handler, Client1::Site::Handler,
Client2::App::Handler, Client2::Site::Handler, etc. Another alternative is to
run a separate mod_perl backend apache for each client and just have the front
end proxy redirect to the right one based on the virtual host. Depending on how
many clients you have though, that could get a little wasteful.
--
Michael Peters
Plus Three, LP
Re: refactoring client"s decision
am 12.05.2008 19:56:33 von Perrin Harkins
On Sun, May 11, 2008 at 2:52 AM, Marc Lambrichs
wrote:
> Secondly, what if we're running the cgi under speedycgi?
You can do this with FastCGI if you run a different FastCGI backend
for every virtualhost. The same thing would work with mod_perl if you
run a different mod_perl-enabled backend apache for each virtualhost
and proxy to them from the frontend apache.
- Perrin
Re: refactoring client"s decision
am 13.05.2008 05:13:16 von Foo JH
Creating packages with the same name for multiple sites is generally a
recipe for confusion. Following what Michael Peters said, the better way
will be to create a properly namespaced package instead.
But in the event that the right thing cannot be done, you can consider
creating a new interpreter for each site with the Options +Parent config
in Apache. Do note that this solution may be memory intensive, and will
not scale as broadly as a shared interpreter.
IMHO, try to get things right the first time. It's usually more painful
to revisit a quick-fix.
Marc Lambrichs wrote:
> I've taken over some code for a client. They've built a framework that
> used to run under mod_perl and changed it later, because of problems
> they had - what problems remains unknown - to cgi. Ofcourse I'm
> curious why they changed it. Here's my view: they create a parent
> App::Handler and in every virtual host they create a Site::Handler
> which has App::Handler as base. My first guess is that under mod_perl
> you don't know which Site::Handler will be called. Ofcourse, at first,
> the handler you're actually pointing to will be called, but if you
> change the request to another virtualhost, the wrong handler will be
> called.
>
> This would explain why it's running perfectly under cgi, because in
> every script call the correct lib path is defined.
>
> So, my first question is: am I right?
> Secondly, what if we're running the cgi under speedycgi?
>
> Thx,
> Marc
Re: refactoring client"s decision
am 14.05.2008 03:40:21 von jonathan vanasco
On May 11, 2008, at 2:52 AM, Marc Lambrichs wrote:
> Here's my view: they create a parent App::Handler and in every
> virtual host they create a Site::Handler which has App::Handler as
> base. My first guess is that under mod_perl you don't know which
> Site::Handler will be called. Ofcourse, at first, the handler
> you're actually pointing to will be called, but if you change the
> request to another virtualhost, the wrong handler will be called.
Unless I'm confused, I've been doing that for years without issue.
I routinely have
P2XLP::$package -> base namespace
MyApp::$package -> @ISA( P2XLP::App::$package )
then use agressive class inheritance and package variables /
methods to make everything work beautifully.
Re: refactoring client"s decision
am 14.05.2008 15:50:29 von mpeters
Jonathan Vanasco wrote:
> Unless I'm confused, I've been doing that for years without issue.
>
> I routinely have
>
> P2XLP::$package -> base namespace
> MyApp::$package -> @ISA( P2XLP::App::$package )
Are you saying that you have multiple MyApp::Foo packages running under the same
mod_perl interpreter (which was what the OPs client was trying to do before
giving up and going with normal CGI)? That won't behave correctly. Perl will
always use the first one it finds and ignore the rest.
--
Michael Peters
Plus Three, LP