2017-01-02 66 views
0

我使用AngularJs作爲單頁應用程序,並通過JSON與服務器端PHP進行通信。 PHP的首部設置了JSON,但錯誤從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的Content-Type頭的PHP錯誤拋出。我應該使用multicontent types還是該怎麼辦?

enter image description here

回答

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錯誤來停止您的應用程序,而是如果您需要返回JSON結果,請執行乾淨退出。 您可以使用try...catch模式或在實際調用之前檢查引發錯誤的語句(例如,檢查是否可以繼續執行)。

看一看這裏:

一定要記住關閉錯誤在最終應用程序:他們可能泄漏了大量的信息,攻擊者(和此外,他們看起來很糟糕)。

+0

代碼很好,只是方便查看解析的json中的php錯誤,以便在角度表達式中直接查看任何錯誤。與信息泄漏良好的提示。 – ItsmeJulian