You can register a shutdown function that gets called even in the case of a
fatal error. We use something like this:
public function init() {
register_shutdown_function(array('Bootstrap', 'fatalErrorCatcher'));
...
}
public function fatalErrorCatcher() {
$error = error_get_last();
if( $error && (
$error['type'] === E_ERROR ||
$error['type'] === E_COMPILE_ERROR ||
$error['type'] === E_CORE_ERROR ||
$error['type'] === E_PARSE
)) {
// kill the buffer content, it's broken anyway
while(ob_get_level()) {
ob_end_clean();
}
// log error to a file
...
// issue 500 and dump out a static "site is broken oh noes!"
page
header('HTTP/1.1 500 Internal Server Error');
echo file_get_contents('fail-whale.html');
}
}
In catchFatalError() we check the last error to see if it's truly fatal. Our
general error-handler has already handled all other error types, and this
since function gets called no matter how the PHP process shutsdown, you
don't want to issue a 500 for a successful request. :)
David