【问题标题】:Report PHP errors in JSON format complying with the regular content-type以符合常规内容类型的 JSON 格式报告 PHP 错误
【发布时间】:2017-05-16 21:45:22
【问题描述】:

我将 AngularJs 用于单页应用程序,并通过 JSON 与服务器端 PHP 进行通信。 php头设置JSON,但是从php报错:

php_flag display_errors 1
php_flag display_startup_errors 1
php_value error_reporting 32767

是 html 并且与常规答案 header('Content-Type: application/json;charset=utf-8'); 的内容类型标题不匹配
因此 angularjs 不断抛出 php 错误。我应该使用multicontent types 还是该怎么做?

【问题讨论】:

    标签: php angularjs json error-reporting


    【解决方案1】:

    如果您必须将 PHP 错误/异常返回给客户端,这是不推荐的(但我知道,这更容易开发),您需要为 PHP 定制一个 error/uncaught-exception 处理程序。通过这种方式,您可以自定义错误/异常的显示方式。

    这是一个将错误和未捕获的异常作为 JSON 对象输出的示例代码。

    // Set error handler
    set_error_handler('api_error_handler');
    
    function api_error_handler($errno, $errstr) {
        return api_error($errstr, $errno, 500);    
    }
    
    // Set uncaught exceptions handler    
    set_exception_handler('api_exception_handler');
    
    function api_exception_handler($exception) {
        return api_error($exception->getMessage(), $exception->getCode(), 500);
    }
    
    // Error/Exception helper
    function api_error($error, $errno, $code) {
        // In production, you might want to suppress all these verbose errors
        // and throw a generic `500 Internal Error` error for all kinds of 
        // errors and exceptions.
        if ($environment == 'production') {
            $errno = 500;
            $error = 'Internal Server Error!';
        }
    
        http_response_code($code);
        header('Content-Type: application/json');
    
        return json_encode([
            'success' => false,
            'errno'   => $errno,
            'error'   => $error,
        ]);
    }
    

    但这还不是全部;由于用户定义的错误处理程序无法处理致命错误,因此仍会显示致命错误消息。您需要通过调用 ini_set() 来禁用显示错误:

    ini_set('display_errors', 0);
    

    那么如何处理致命错误呢?可以在关机时使用register_shutdown_function() 处理致命错误。在关闭处理程序中,我们需要通过调用error_get_last() 来获取最后的错误信息。所以:

    // Set shutdown handler
    register_shutdown_function('api_fatal_error_handler');
    
    function api_fatal_error_handler() {
        $error = error_get_last();
    
        if ($error && error_reporting() && $error['type'] === E_ERROR) {
            return api_error($error['message'], E_CORE_ERROR, 500);
        }
    }
    

    然后在 javascript 方面,您必须添加一个错误回调并向用户显示错误信息。

    毕竟,为什么不使用成熟的错误/异常处理程序包而不是实现所有这些呢?认识Whoops

    【讨论】:

      【解决方案2】:

      为什么您的应用程序依赖 PHP 错误? 如果可能,请提供引发错误的代码部分。

      您不应该使用 PHP Error 来停止您的应用程序,如果您需要返回 JSON 结果,请执行干净退出。 您可以使用try...catch 模式或在实际调用之前检查引发错误的语句(例如检查是否可以继续执行)。

      看看这里:

      永远记得关闭最终应用程序中的错误:它们可能会向攻击者泄露大量信息(而且,它们看起来很糟糕)。

      【讨论】:

      • 代码很好,只是方便查看解析的 json 中的 php 错误,以便直接在角度表达式中查看任何错误。信息泄漏的好提示。
      猜你喜欢
      • 2012-11-03
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多