現在の位置: ホーム> 最新記事一覧> Register_shutdown_functionどのエラーをキャッチできませんか?一般的な誤解の分析

Register_shutdown_functionどのエラーをキャッチできませんか?一般的な誤解の分析

gitbox 2025-05-26

1. register_shutdown_functionの簡単な説明

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));
    }
});

2。キャプチャできるエラーの種類

登録_shutdown_functionがキャッチできるエラーは、通常、スクリプトが終了する前にERROR_GET_LAST()に記録される「致命的なエラー」です。キャッチできる一般的なタイプのエラーは次のとおりです。

  • E_ERROR :実行時の致命的なエラー

  • e_parse :解析エラー(場合によっては)

  • e_core_errore_compile_error :phpが起動したときの致命的なエラー

  • E_USER_ERROR :ユーザーが定義した致命的なエラー

これらのエラーは通常、スクリプト割り込みを引き起こします。その場合、シャットダウン関数は、error_get_last()を介してエラーの詳細を実行およびキャプチャする機会があります。


3。キャプチャできないエラーの種類と状況

Register_shutdown_functionは強力ですが、全能ではありません。次のタイプのエラーまたは状況はcontしていないものです。

1。E_NOTICE E_WARNINGなどの非致命的なエラー

非脂肪エラーはスクリプト割り込みを引き起こさないため、 register_shutdown_functionのエラー処理ロジックがトリガーされていません:

 echo $undefined_variable; // 報告 notice,実行には影響しません

シャットダウン関数は呼び出されますが、 ERROR_GET_LAST()によって返されるコンテンツには、これらの非脂肪性エラーは含まれません。

2。早めにスクリプトを終了する関数: exit()またはdie()

スクリプトが出口または死亡経由で積極的に終了し、終了する前に致命的なエラーをスローしない場合、 ERROR_GET_LAST()の戻り値はnullです。

 exit("プログラムを終了します"); // トリガー shutdown,ただし、エラー記録はありません

3。一部の解析段階での解析エラー

一部の構文エラーはPHP解析段階で発生し、スクリプトは実行プロセスに入力されません。

 // 次のコードは、解析を直接引き起こします,登録できません shutdown 関数
echo "Hello

4.致命的なエラーが発生する前に完了しなかった出力バッファーコンテンツが失われる

「エラーをキャッチできない」ではありませんが、致命的なエラーが発生する前にOB_START()が有効になっていない場合、ページの出力が失われ、エラープロンプトがなくなる可能性があることに注意してください。この状況は、多くの場合、「シャットダウン関数が無効である」と間違っています。

5。エラー抑制文字@

エラーサプレッサーは致命的なエラーを防ぐことはできませんが、致命的ではないエラーの表示を抑制し、混乱を引き起こす可能性があります。 Register_shutdown_function @でも致命的なエラーをキャッチできます。

 @trigger_error("This is a user warning", E_USER_WARNING); // 捕獲されません

4。一般的な誤解の分析

誤解1:「シャットダウン機能はすべてのエラーをキャッチする可能性があります」

前述のように、 Register_shutdown_functionは致命的なエラーのみを処理することができ、一般的なエラー処理メカニズムとして使用することはできません。 e_warninge_noticeの場合、 set_error_handlerを使用する必要があります。

誤解2:「1つのシャットダウン関数を使用するだけで十分です」

エラー処理は複数のレベルで防御する必要があります。ベストプラクティスは、組み合わせて使用​​することです。

  • set_error_handler()は、警告や通知などの非致命的なエラーをキャプチャします。

  • set_exception_handler() excatupedの例外をキャッチします。

  • Register_shutdown_function()は、スクリプトが終了する前に最後のエラーをキャプチャします。

誤解3:「出力がないということは、シャットダウン機能が機能しないことを意味します」

多くの場合、シャットダウンは実際に実行されますが、 error_get_last()nullを返し、記録されていないため、開発者は関数が機能しないと誤って考えます。


5.正しいエラー処理のアイデア

より包括的なエラー処理システムには、次の組み合わせをお勧めします。

 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']));
    }
}