cLive ;-) has asked for the wisdom of the Perl Monks concerning the following question:

For "reasons", I'm loading a few Plack apps under mod_perl via Plack::Handler::Apache2. During a recent tidy up, I've been moving from one vhost entry per app, to a single vhost entry that uses Plack::App::URLMap, and adding an explicit load of all app modules pre-fork.

Loader app look like this

# find all modules in the apps' directories, and load them via Module: +:Load (so they are in mod_perl parent) # create URL mappings of the apps # %app_modules has app names as keys, and app namespaces as lavues APP: foreach my $app_name (keys %$app_modules) { my $uri_path = "/$app_name"; my $app_namespace = $app_modules->{$app_name}; $urlmap->mount( $uri_path => ${app_namespace}->to_app ); } $urlmap->to_app;

For two example Dancer apps like this, it works as expected:

package App1; use Dancer2; our $VERSION = '0.1'; get '/' => sub { return "THIS IS ROOT IN APP 1"; }; true;
But when I switch to the proper apps, I hit a problem. In the app, I have the code: use My::App qw(exported_method);

That app does not appear to load. I see no error thrown.

however, if I change the line to My::App->import('exported_method'); it works as expected.

I've been scratching my head over this for a few days now, and wondered if anyone has hit anything like this before, or has any pointers on where I should be digging to work this one out.

It looks like things start behaving if I remove the Module::Load code and don't preload everything (but loading the app this way doesn't preload all the app's dependancies).

Replies are listed 'Best First'.
Re: Odd behavior when trying to preload Plack apps under mod_perl
by Anonymous Monk on Sep 09, 2022 at 02:06 UTC
    Minimal code to reproduce error, this is the place to start

        Thanks for that insight. I missed it!

        Unfortunately I can't spin the apps up separately because they need to run alongside mod_perl to expose code from the existing app, but this helps.