如何捕获PHP致命错误

我可以用它set_error_handler()来捕获大多数PHP错误,但它不适用于fatal(E_ERROR)错误,比如调用一个不存在的函数。是否有另一种方法来捕捉这些错误?

我正在尝试调用mail()所有错误,并运行PHP 5.2.3。

答案


使用register_shutdown_function需要PHP 5.2+的日志记录致命错误:

register_shutdown_function( "fatal_handler" );

function fatal_handler() {
    $errfile = "unknown file";
    $errstr  = "shutdown";
    $errno   = E_CORE_ERROR;
    $errline = 0;

    $error = error_get_last();

    if( $error !== NULL) {
        $errno   = $error["type"];
        $errfile = $error["file"];
        $errline = $error["line"];
        $errstr  = $error["message"];

        error_mail(format_error( $errno, $errstr, $errfile, $errline));
    }
}

你将不得不定义error_mailformat_error功能。例如:

function format_error( $errno, $errstr, $errfile, $errline ) {
    $trace = print_r( debug_backtrace( false ), true );

    $content = "
    <table>
        <thead><th>Item</th><th>Description</th></thead>
        <tbody>
            <tr>
                <th>Error</th>
                <td><pre>$errstr</pre></td>
            </tr>
            <tr>
                <th>Errno</th>
                <td><pre>$errno</pre></td>
            </tr>
            <tr>
                <th>File</th>
                <td>$errfile</td>
            </tr>
            <tr>
                <th>Line</th>
                <td>$errline</td>
            </tr>
            <tr>
                <th>Trace</th>
                <td><pre>$trace</pre></td>
            </tr>
        </tbody>
    </table>";
    return $content;
}

使用Swift Mailer编写error_mail函数。

也可以看看:


刚刚想出了这个解决方案(PHP 5.2.0+):

function shutDownFunction() { 
    $error = error_get_last();
    // fatal error, E_ERROR === 1
    if ($error['type'] === E_ERROR) { 
        //do your stuff     
    } 
}
register_shutdown_function('shutDownFunction');

http://www.php.net/manual/en/errorfunc.constants.php中定义了不同的错误类型

添加评论

友情链接:蝴蝶教程