ApacheReload
Warning: These wiki pages have not been edited in years and may well be out of date/inaccurate. We recommend that you use them as a starting point for further investigation, rather than gospel.
Apache::Reload is a useful module that automatically loads modules when they change. It is more flexible and more maintained than the original Apache::!StatINC. It does, however, have one nasty interaction with Mason; read on.
==== Persistent error problem
If you use Apache::Reload in its default mode, e.g. just
PerlInitHandler Apache::Reload
and you use Mason object files (the default), then you will get an annoying "persistent error" problem. Once you create an error in a component,
you'll repeatedly see that error appearing in the error logs, with a call stack originating in Apache/Reload.pm. The error will persist no matter how many times you fix the component and reload.
There are two fixes:
1. Turn off !ReloadAll mode and explicitly tell Apache::Reload what to reload:
PerlSetVar ReloadAll Off
PerlSetVar ReloadModules "My::Foo My::Bar Foo::Bar::Test"
2. Turn off Mason object files, e.g.
PerlSetVar MasonUseObjectFiles 0
Both of these apply only to development servers. For maximum performance on production servers, you should turn off Apache::Reload and use Mason object files.
But, even on development, we recommend #1 if you can manage it. Otherwise Apache:Reload will stat every CPAN module you are using on every request.
==== Explanation
The reason this happens is because, by default, Apache::Reload checks everything in %INC. That includes, rather inappropriately, Mason's object files (because Mason loads them with a 'do' command.) The first time you put an error in a component, Mason will create an object file with an error in it. Thereafter, Apache::Reload will notice the object file has changed and continually try to reload it - before Mason ever gets a chance to recompile it from the fixed source file. There is, of course, no earthly reason for Apache::Reload to look at Mason's object files, but there's no way for it to know that.
Thanks to MichaelDavis and KatePorter for helping to track this down.