PHP错误/异常处理 - 隐藏错误但处理它?

时间:2014-01-12 12:07:22

标签: php error-handling

我正在研究API服务器,我想处理所有PHP错误和异常。 因此,当我向我的API服务器发出请求时,响应将始终保持一致 - 即使在致命的php错误或我的其他类的一些内部异常期间也是如此。

我想出了以下内容:

// Register Custom Error Handler
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', 'logs/php-errors.log');
function ErrorHandler($errno, $errstr, $errfile, $errline) {
    HandleError($errstr, $errfile, $errline);
}
function ExceptionErrorHandler(Exception $e) {
    HandleError($e->getMessage(), $e->getFile(), $e->getLine());
}
function ShutdownFunction() {
    $error = error_get_last();
    if (!is_null($error) && sizeof($error)) {
        HandleError($error['message'], $error['file'], $error['line']);
    }
}
function HandleError($message, $file, $line)
{
    // Prepare Error Data
    $error_data = 'File  : '. basename($file)              ."\r\n".
                  'Line  : '. $line                        ."\r\n".
                  'When  : '. date('l jS \of F Y h:i:s A') ."\r\n".
                  'Error : '. $message;

    // Log Error To File
    $h = fopen('logs/'. date('d-m-Y') .'.log', 'a');
    fwrite($h, $error_data."\r\n----------------------------------------------------------------------\r\n\r\n");
    fclose($h);

    // Exit With Error
    header('Content-type: application/json');
    exit(json_encode(array(
        'IsError'  => true,
        'ErrorMsg' => $message .' | '. basename($file) .':'. $line,
        'Data'     => ''
    )));
}
set_error_handler("ErrorHandler");
set_exception_handler('ExceptionErrorHandler');
register_shutdown_function('ShutdownFunction');

为了测试这一点,在我的一个文件中,我调用了一个名为test()的非现有函数,这是产生的响应:

<br />
<b>Fatal error</b>:  Call to undefined function test() in <b>/home/www-data/public_html/ipos_api/api_methods.php</b> on line <b>11</b><br />
{"IsError":true,"ErrorMsg":"Call to undefined function test() | api_methods.php:11","Data":""}

为什么不隐藏php错误(就在我的json响应之上)?我已将 display_error 设置为关闭。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

弄清问题是什么。

我正在使用Nginx和PHP-FPM。在我的php-fpm.d池配置中,我已经指定了display_errors,因此它覆盖了所有设置(使用ini_set和php.ini它的内联在线)。

删除该配置行并重新启动php-fpm后,我能够隐藏错误消息并仍然处理它。