Restful 対応の Web サービス サイトを持っているので、他の Web サイト/ajax スクリプトがそのサイトを呼び出してデータを取得/設定できます。ただし、Web サービス サイトが何らかの形で PHP の致命的なエラーを返すたびに、返される HTTP ステータスは 500 ではなく 200 です。致命的なエラーが発生するたびに 200 ではなく 500 を返すように修正する方法はありますか? または、それが不可能な場合、Web サービスによって返される致命的なエラーを認識するようにクライアントを変更するにはどうすればよいですか?
6 に答える
PHPは致命的なエラーで HTTP 500 を送信します。この PHP バグレポート
のコメントを引用させてください(xdebug バグにより、この動作が妨げられます)。
それは起こります。次のことが必要です。
1) display_errors = off
2) エラーが発生するまでにヘッダーはまだ送信されていません
3) その時点でステータスは 200 です。
<?
ini_set('display_errors', 0);
foobar();
// This will return a http 500
?>
shutdown 関数とerror_get_lastを使用して、致命的なエラーをキャッチできます。
register_shutdown_function(function() {
$lastError = error_get_last();
if (!empty($lastError) && $lastError['type'] == E_ERROR) {
header('Status: 500 Internal Server Error');
header('HTTP/1.0 500 Internal Server Error');
}
});
考えられる 1 つの方法は、デフォルトの応答を 500 に設定することです。すべてが正常に実行された場合は、応答を 200 に設定します。
http_response_code(500);
render_my_page();
http_response_code(200);
function fatal_error_handler() {
if (@is_array($e = @error_get_last())) {
if (isset($e['type']) && $e['type']==1) {
header("Status: 500 Internal Server Error");
header("HTTP/1.0 500 Internal Server Error");
}
}
}
register_shutdown_function('fatal_error_handler');
カスタム エラー ハンドラ ( set_error_handler
) を作成し、 を呼び出しますheader("HTTP/1.0 500 Service not available");
。
編集:
私の回答に対する最初のコメントによると、真の致命的なエラーをトラップすることはできません。ただし、出力バッファリングが無効で、エラーが画面に表示されない場合、PHP はデフォルトで致命的なエラーに 500 エラー コードを設定します。
<?php
$x = y();
?>
画面に何も送信されていない場合、上記のコードは 500 エラー コードを返します。
したがって、この種のエラーに適切なコードを設定する場合は、独自のバッファリングを行います。
<?php
$buffer = 'blah';
$x = y(); // will trigger 500 error
echo $buffer;
?>
アプリケーションをデプロイする前に、すべての致命的なエラーをキャッチして修正することをお勧めします。これらのエラーの多くはコードエラーであり、含まれていないオブジェクト、存在しないオブジェクト、すべて開発エラーです。メモリ不足のエラーでさえ、メモリが不足しているコーディング手法を使用することで最小限に抑えることができます(最大の利点の1つは、巨大な配列をスローする代わりに、バッファなしのクエリを使用してデータを処理し、結果セットが返されるときに出力を出力することです)。