Home / Documentation / 1.0 / API / | ||||
Apache::SIG - Override apache signal handlers with Perl's | ||||
|
||
When a client drops a connection and apache is in the middle of a
write, a timeout will occur and httpd sends a SIGPIPE
. When
apache's SIGPIPE
handler is used, Perl may be left in the middle of
it's eval context, causing bizarre errors during subsequent requests
are handled by that child. When Apache::SIG
is used, it installs a
different SIGPIPE
handler which rewinds the context to make sure
Perl is back to normal state, preventing these bizarre errors.
If you would like to log when a request was cancelled by a SIGPIPE
in your Apache access_log, you can declare Apache::SIG
as a
handler (any Perl*Handler
will do, as long as it is run before
PerlHandler
, e.g. PerlFixupHandler
), and you must also define a
custom LogFormat
in your httpd.conf, like so:
PerlFixupHandler Apache::SIG LogFormat "%h %l %u %t \"%r\" %s %b %{SIGPIPE}e"
If the server has noticed that the request was cancelled via a
SIGPIPE
, then the log line will end with 1
, otherwise it will
just be a dash.
The signal handler in this package uses the subprocess_env table of
the main request object to supply the SIGPIPE
"environment
variable" to the log handler. If you already use the key SIGPIPE
in
your subprocess_env
table, then you can redefine the key like this:
$Apache::SIG::PipeKey = 'my_SIGPIPE';
and log it like this:
LogFormat "%h %l %u %t \"%r\" %s %b %{my_SIGPIPE}e"
|