まず、PHP 5.4.3 を使用しています。
私が抱えている問題は、PHP ファイルでエラー (解析エラーなど) が発生するたびに、HTMLでエラー メッセージが表示され、ページの HTTP ステータスが 200 になることです。
私が知りたいのは、エラーが発生した場合に HTTP ステータスを 500 に設定し、エラーをまったく表示しないようにする方法です。
すべてのページで HTTP ステータス 500 を表示したくないことに注意してください。
まず、PHP 5.4.3 を使用しています。
私が抱えている問題は、PHP ファイルでエラー (解析エラーなど) が発生するたびに、HTMLでエラー メッセージが表示され、ページの HTTP ステータスが 200 になることです。
私が知りたいのは、エラーが発生した場合に HTTP ステータスを 500 に設定し、エラーをまったく表示しないようにする方法です。
すべてのページで HTTP ステータス 500 を表示したくないことに注意してください。
レジスタシャットダウン機能を使用できます。ソース: PHP : カスタム エラー ハンドラ - 解析エラーと致命的エラーの処理
ini_set('display_errors', 0);
function shutdown() {
if (!is_null(error_get_last())) {
http_response_code(500);
}
}
register_shutdown_function('shutdown');
E_PARSE エラーは、シャットダウン関数が登録された後に含まれる/必要とされるファイルでのみキャッチされることに注意してください。
myninjaname の答えはほぼ正しいですが、終了時に出力バッファーで何が起こったのかわかりません。また、コードは常に最後まで実行されます。状況をすぐに処理することに加えて、出力バッファリングとカスタム error_handler を使用して、ブラウザーへの応答を保証します。これにより、エラーに関連する情報をトラップしてログに記録しやすくなり、バグを修正できます。
<?php
ob_start();
set_error_handler('whoops');
function whoops($errno, $errstr, $errfile, $errline, $errcontext)
{
header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
$logged="$errno: $errstr\nin $errfile at $errline\n";
foreach($errcontext as $scoped=>$val) {
$logged.=" $scoped = $val\n";
}
$logged.="Output = " . ob_get_clean() . "\n";
// NB still buffering...
debug_print_backtrace();
$logged.="stack trace = " . ob_get_clean() . "\n";
print "whoops";
ob_end_flush();
write_log_file($logged);
exit;
}
解析エラーは実際に処理できます。解析エラーは、不適切なコードを作成してデプロイしたときに発生します。本番システムでこれが発生するのを防ぐ方法を知っておく必要があります。問題を解決するためにさらにコードを追加することは、矛盾した表現です。
また、ini ファイルでdisplay_errors=0を設定して、エラーの表示 (レポートではない) を無効にする必要があります。
アップデート
カスタムエラーハンドラーで発生するエラーをキャッチしようとしましたが、何らかの理由で、解析エラー (および他のいくつかのエラー) をキャッチしないと言う人がいます。
これを自分でテストする方法がわかりませんか?IIRC は、コンテキスト (シャットダウン関数は、含まれているコンテンツの一部の解析エラーをキャッチできます) と PHP のバージョンに大きく依存します。しかし、上記のように、本番システムでこのようなエラーが発生するようになった場合、それは作業を適切に実行できなかったことが原因です。
応答コードを設定するだけです。
http_response_code(500);
error_reporting(0)
;でエラー報告をオフにします。header("HTTP/1.0 500 Internal Server Error");
参照