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

Reply via email to