2017-01-02 4 views
0

私はAngularJを1ページアプリケーションに使用し、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');
のContent-Typeヘッダに一致しない、常にPHPエラーにスローangularjs。 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()を呼び出して、最後のエラー情報を取得する必要があります。したがって:

次にjavascript側で、エラーコールバックを追加し、エラー情報をユーザーに表示する必要があります。

これらのすべてを実装するのではなく、成熟したエラー/例外ハンドラパッケージを使用してみませんか? Meet Whoopsをご覧ください。

2

なぜあなたは、あなたのアプリケーションのためのPHPエラーに依存していますか? 可能であれば、エラーを引き起こすコードの部分を指定します。

JSON結果を返す必要がある場合は、PHPエラーを使用してアプリケーションを停止するのではなく、クリーンな終了を行うべきです。 try...catchパターンを使用するか、実際に呼び出す前にエラーを発生させるステートメントを調べることができます(たとえば、実行することが可能かどうかを確認するなど)。

はこちらをご覧:

は、必ず最終的なアプリケーションでエラーをオフにすることを忘れないでください:彼らは攻撃者に多くの情報を漏らすことができ(とさらに、彼らは単にひどく見える)。

+0

コードは問題ありません。解析されたjsonのphpエラーを見て、角度式の中にエラーがないかどうかを確認するのが便利です。情報漏えいのヒント。 – ItsmeJulian

関連する問題