32

die()キャッチ&exit()メッセージできるようにしたいです。これは可能ですか?と に似たものを期待していset_error_handlerますset_exception_handler。私は見ましたが、問題と呼び出しregister_shutdown_function()のコンテキストが含まれていないようです。die()exit()

私はそれを理解しdie()exit()エラーを処理する悪い方法です。私はこれをしないように言われるつもりはありません。:) 私は一般的なシステムを作成しており、適切にログexit()を記録できるようにしたいdie()と考えています。何らかの理由で誰か (私ではない) がこれを実行することをお勧めします。

4

7 に答える 7

7

PHP マニュアルによると、die() または exit() が呼び出されたときにシャットダウン関数に通知する必要があります。

exit() が呼び出された場合でも、シャットダウン関数オブジェクト デストラクタは常に実行されます。

exit($status) で送信されたステータスを取得することはできないようです。出力バッファリングを使用してキャプチャできない場合を除きますが、 を呼び出すタイミングをどのように知るかはわかりませんob_start()

于 2010-10-01T04:31:02.527 に答える
5

APD が利用可能であれば、override_function()が興味深いかもしれませ ん

于 2010-10-01T04:46:48.593 に答える
4

私が言える限り、これは実際には不可能です。ここに掲載されているソリューションの一部は機能する可能性がありますが、多くの追加作業や多くの依存関係が必要です。die() および exit() メッセージを簡単かつ確実にトラップする方法はありません。

于 2010-10-18T19:34:31.043 に答える
0

代わりにカスタム エラー処理を使用しないのはなぜですか? そうでない場合は、いつでもLD_PRELOADとCコードインジェクションを使用してキャッチできます:)または、カスタマイズしてphpを再コンパイルします:P

于 2010-10-01T07:44:48.923 に答える
0

シングル ポイント エントリー方式を使用する場合。(index.php)エラー処理にはこれをお勧めします:

短縮版:

ob_start();
register_shutdown_function('shutdownHandler');

include('something');

define(CLEAN_EXIT, true);

function shutdownHandler() {
    if(!defined("CLEAN_EXIT") || !CLEAN_EXIT) {
        $msg = "Script stopped unexpectedly: ".ob_get_contents();
        //Handle premature die()/exit() here
    }
}

追加の手順と詳細:

ざっくり私のやり方。ここに示すよりもさらに多くのことを行っています (データベース トランザクションの処理/ロールバック/電子メールの送信/ログの書き込み/わかりやすいエラー メッセージの表示/ユーザー エラーの報告など) が、これがすべての背後にある基本的な考え方です)。
それが誰かを助けることを願っています。

<?php

    //Some initialization

    //starting output buffering. (fatalErrorHandler is optional, but I recommend using it) 
    ob_start('fatalErrorHandler');

    //Execute code right at the end. Catch exit() and die() here. But also all other terminations inside PHPs control
    register_shutdown_function('shutdownHandler');

    //handling other errors: Also optional
    set_error_handler('errorHandler');



    try {
        //Include of offensive code
        include(...);
    }
    catch (Exception $ex) {
        //Handling exception. Be careful to not raise exceptions here again. As you can end up in a cycle. 
    }

    //Code reached this point, so it was a clean exit.
    define(CLEAN_EXIT, true);


    //Gets called when the script engine shuts down.
    function shutdownHandler() {

        $status = connection_status();

        $statusText = "";

        switch ($status) {
            case 0:
                if (!defined("CLEAN_EXIT") || !CLEAN_EXIT) {
                                    $msg = "Script stopped unexpectedly: ".ob_get_contents();
                    //Handle premature die()/exit() here
                }
                else {
                    //Clean exit. Just return
                    return;
                }
            case 1: $statusText = "ABORTED (1)"; break;
            case 2: $statusText = "TIMEOUT (2)"; break;
            case 3: $statusText = "ABORTED & TIMEOUT (3)"; break;

            default : $statusText = "UNKNOWN ($status)"; break;
        }

        //Handle other exit variants saved in $statusText here ob_get_contents() can have additional useful information here
    }

    // error handler function  (This is optional in your case)
    function errorHandler($errno, $errstr, $errfile, $errline) {

        $msg = "[$errno] $errstr\nOn line $errline in file $errfile";

        switch ($errno) {
            case E_ERROR:               $msg = "[E_ERROR] ".$msg;               break;
            case E_WARNING:             $msg = "[E_WARNING] ".$msg;             break;
            case E_PARSE:               $msg = "[E_PARSE] ".$msg;               break;
            case E_NOTICE:              $msg = "[E_NOTICE] ".$msg;              break;
            case E_CORE_ERROR:          $msg = "[E_CORE_ERROR] ".$msg;          break;
            case E_CORE_WARNING:        $msg = "[E_CORE_WARNING] ".$msg;        break;
            case E_COMPILE_ERROR:       $msg = "[E_COMPILE_ERROR] ".$msg;       break;
            case E_COMPILE_WARNING:     $msg = "[E_COMPILE_WARNING] ".$msg;     break;
            case E_USER_ERROR:          $msg = "[E_USER_ERROR] ".$msg;          break;
            case E_USER_WARNING:        $msg = "[E_USER_WARNING] ".$msg;        break;
            case E_USER_NOTICE:         $msg = "[E_USER_NOTICE] ".$msg;         break;
            case E_STRICT:              $msg = "[E_STRICT] ".$msg;              break;
            case E_RECOVERABLE_ERROR:   $msg = "[E_RECOVERABLE_ERROR] ".$msg;   break;
            case E_DEPRECATED:          $msg = "[E_DEPRECIATED] ".$msg;         break;
            case E_USER_DEPRICIATED:    $msg = "[E_USER_DEPRICIATED] ".$msg;    break;
            default:                    $msg = "[UNKNOWN] ".$msg;               break;
        }

        //Handle Normal error/notice/warning here. 
        $handled = ...

        if ($handled)
            return true; //handled. Proceed execution
        else
            throw Exception($msg); //Be careful. this might quickly become cyclic. Be sure to have code that catches and handles exceptions. Else die() here after logging/reporting the error.

    }

    function fatalErrorHandler(&$buffer) {

        $matches = null;
        //Checking if the output contains a fatal error
        if (preg_match('/<br \/>\s*<b>([^<>].*)error<\/b>:(.*)<br \/>$/', $buffer, $matches) ) {

            $msg = preg_replace('/<.*?>/','',$matches[2]);

            //Handle Fatal error here

            return "There was an unexpected situation that resulted in an error. We have been informed and will look into it."
         }

         //No fatal exception. Return buffer and continue
         return $buffer;
    }
于 2017-12-15T18:37:12.790 に答える
-4

はい: 関数を作成し、代わりにそれを使用します。

function kill($msg){
    // Do your logging..
    exit($msg);
}
于 2010-10-01T05:09:31.557 に答える