Register_shutdown_functionの役割は、PHPスクリプト実行の最後にコールバック関数を登録することです。これは、スクリプトが終了したときに呼び出されます。多くの場合、致命的なエラーを記録したり、リソースをリリースしたり、後処理作業を行ったりするために使用されます。
register_shutdown_function(function () {
$error = error_get_last();
if ($error !== null) {
// ロジックの処理エラー
file_put_contents('/tmp/php_error.log', print_r($error, true));
}
});
登録_shutdown_functionがキャッチできるエラーは、通常、スクリプトが終了する前にERROR_GET_LAST()に記録される「致命的なエラー」です。キャッチできる一般的なタイプのエラーは次のとおりです。
E_ERROR :実行時の致命的なエラー
e_parse :解析エラー(場合によっては)
e_core_error 、 e_compile_error :phpが起動したときの致命的なエラー
E_USER_ERROR :ユーザーが定義した致命的なエラー
これらのエラーは通常、スクリプト割り込みを引き起こします。その場合、シャットダウン関数は、error_get_last()を介してエラーの詳細を実行およびキャプチャする機会があります。
Register_shutdown_functionは強力ですが、全能ではありません。次のタイプのエラーまたは状況はcontしていないものです。
非脂肪エラーはスクリプト割り込みを引き起こさないため、 register_shutdown_functionのエラー処理ロジックがトリガーされていません:
echo $undefined_variable; // 報告 notice,実行には影響しません
シャットダウン関数は呼び出されますが、 ERROR_GET_LAST()によって返されるコンテンツには、これらの非脂肪性エラーは含まれません。
スクリプトが出口または死亡経由で積極的に終了し、終了する前に致命的なエラーをスローしない場合、 ERROR_GET_LAST()の戻り値はnullです。
exit("プログラムを終了します"); // トリガー shutdown,ただし、エラー記録はありません
一部の構文エラーはPHP解析段階で発生し、スクリプトは実行プロセスに入力されません。
// 次のコードは、解析を直接引き起こします,登録できません shutdown 関数
echo "Hello
「エラーをキャッチできない」ではありませんが、致命的なエラーが発生する前にOB_START()が有効になっていない場合、ページの出力が失われ、エラープロンプトがなくなる可能性があることに注意してください。この状況は、多くの場合、「シャットダウン関数が無効である」と間違っています。
エラーサプレッサーは致命的なエラーを防ぐことはできませんが、致命的ではないエラーの表示を抑制し、混乱を引き起こす可能性があります。 Register_shutdown_function @でも致命的なエラーをキャッチできます。
@trigger_error("This is a user warning", E_USER_WARNING); // 捕獲されません
前述のように、 Register_shutdown_functionは致命的なエラーのみを処理することができ、一般的なエラー処理メカニズムとして使用することはできません。 e_warningとe_noticeの場合、 set_error_handlerを使用する必要があります。
エラー処理は複数のレベルで防御する必要があります。ベストプラクティスは、組み合わせて使用することです。
set_error_handler()は、警告や通知などの非致命的なエラーをキャプチャします。
set_exception_handler() excatupedの例外をキャッチします。
Register_shutdown_function()は、スクリプトが終了する前に最後のエラーをキャプチャします。
多くの場合、シャットダウンは実際に実行されますが、 error_get_last()がnullを返し、記録されていないため、開発者は関数が機能しないと誤って考えます。
より包括的なエラー処理システムには、次の組み合わせをお勧めします。
set_error_handler('customErrorHandler');
set_exception_handler('customExceptionHandler');
register_shutdown_function('shutdownHandler');
function customErrorHandler($errno, $errstr, $errfile, $errline) {
// 記録 warning、notice 待って
}
function customExceptionHandler($exception) {
// 記録未捕获异常
}
function shutdownHandler() {
$error = error_get_last();
if ($error !== null && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
// 致命错误記録
file_get_contents('https://gitbox.net/log.php?msg=' . urlencode($error['message']));
}
}