Check out the Apache::Reload module. It allows code in your .pm files to be recompiled automatically when a change to the file is detected - essential for development.
Update: When I do need to do a graceful restart on the Apache server (eg: to pick up changes to the config file) I tend not to use apachectl directly. If there is a bug in your code or config, it won't be detected until the server tries (and fails) to restart. This leaves you with two problems: the server is down and you have broken code which must be fixed before the server will start. Pressure!
A safer option is to use a custom script which first does a syntax check of you httpd.conf and any Perl modules it loads. If that succeeds that it's safe to call apachctl. Here's the relevant part of my initserver script:
#!/bin/sh
SERVER="/usr/sbin/httpd"
CONFIG="/etc/httpd/conf/httpd.conf"
ARGS=`/bin/ls /usr/lib/apache | perl -nle 'm{^(?:mod_|lib)(.*?)(\.so)?
+$} && print uc("-DHAVE_$1")'`
if ! $SERVER -T $ARGS -f $CONFIG
then
echo "Server not restarted due to errors in config file"
exit 1
fi
apachectl graceful
The ARGS=... line adds command line arguments like -DHAVE_PERL, -DHAVE_REWRITE etc for all the modules which are loaded dynamically. You may or may not need that.
| [reply] [d/l] |
more specifically (from a development site on my own web server):
in the httpd.conf file, inside of a container (either <Location>, <Directory>, or <VirtualHost>) add these lines:
PerlModule Apache::Reload
PerlInitHandler Apache::Reload
PerlSetVar ReloadAll Off
PerlSetVar ReloadTouchFile /tmp/reload.modules
the way it works is this: the first time each module is loaded (or if the module is already in memory, used) mod_perl will check the date/time of the given file. if it has changed since the last time it was parsed, the parsed code in memory will be unloaded and the code will be re-parsed from the disk.
the problem is that doing this check for every module, for every request, causes a signifigant slowdown on a busy server.
setting "ReloadAll Off" turns off the global checking, and the check will only be done for modules which contain the line "use Apache::Reload" in their code.
note that this also works for authentication handlers, in addition to standard content-generation handlers. my guess is that it will work with all handlers, regardless of the request phase they handle, but i've only used it with these two types. | [reply] [d/l] |
| [reply] |
If you are in charge of the Server: Surely kind of brute force, but working without interfering with the usage of the server:
host:~ # apachectl graceful
should do the trick.
regards,
tomte
Update: This obviously doesn't turn off caching, but executed whenever something changed, this should take care of the situation.
| [reply] [d/l] |